选择排序、冒泡排序、插入排序

1. 对数器的设定

1.1. 对数器概念和使用

  - 有一个你想要的测的方法a
  - 实现一个绝对正确但是复杂度不好的方法b
  - 实现对比的方法

  • 把方法a和方法b对比很多次来验证方法a是否是正确的

  • 如果有个样本使得对比出错,打印出样本分析是哪个方法出错的

  • 当样本数量很多的时候,对比测试依然正确,可以确定方法a已经正确  

1.2. 数组排序对数器

package com.company;

import java.util.Arrays;

public class Main {

    private static final int MIN = 0;
    private static final int MAX = 1000;
    private static final int MAXLENGTH = 10000;
    private static final int FREQUENCY = 10000;

    public static void main(String[] args) {
	// write your code here

        boolean succeed = true;
        for (int i = 0; i < FREQUENCY; i++) {
            int[] arr = GenerateRandom();
            int[] arr2 = Arrays.copyOf(arr, arr.length);
//            Arrays.sort(arr);你测试的排序函数
            comparator(arr2);
            if (!Arrays.equals(arr, arr2)) {
                succeed = false;
                break;
            }
        }
        System.out.println(succeed?"succeed":"failed");
    }

    /*
    产生随机数组
     */
    public static int[] GenerateRandom(){
        int length = (int)(MAXLENGTH*Math.random());
        int[] arr = new int[length];
        for (int i = 0; i < length; i++) {
            arr[i] = MIN + (int)(Math.random()*(MAX-MIN));
        }
        return arr;
    }

    /*
    最稳健的对比算法作为对比,此处调用JDK自带的排序算法
     */
    public static void comparator(int[] arr){
        Arrays.sort(arr);
    }

}

2. 选择排序

选择排序的实质就是每次从剩下的数组中选出最值

    /*
    选择排序:实质就是每次选出最值
     */
    public static void chooseSort(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length ; j++) {
                if (arr[j] < arr[minIndex]) { //choose minimum value
                    minIndex = j;
                }
            }
            if (i != minIndex)
                swap(arr, i, minIndex);
        }
    }

    private static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i]^arr[j];
        arr[j] = arr[i]^arr[j];
        arr[i] = arr[i]^arr[j];
    }

3. 冒泡排序

冒泡排序的实质就是进行N次比较

    /*
    冒泡排序:实质就是进行N次比较
     */
    private static void bubbleSort(int[] arr){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[j] > arr[j+1]){
                    swap(arr, i, j);
                }
            }
        }
    }

4. 插入排序

插入排序的实质就是将一个数插入一个有序数组

    /*
    插入排序:实质就是将一个数插入一个有序数组
     */
    private static void insertSort(int[] arr){
        for (int i = 1; i < arr.length; i++) {
            int tmp = arr[i];
            int j = i;
            while (j>0 && arr[j-1]>tmp){//将比他大的数后移
                arr[j] = arr[j-1];
                j--;
            }
            if (i != j)//如果有比他小的数就插入,如果没有就下一次循环
                arr[j] =tmp;
        }
    }
posted @ 2022-03-14 13:41  当时明月在曾照彩云归  阅读(10)  评论(0编辑  收藏  举报