时间复杂度
冒泡排序
public static void bubbleSort(int[] arr){if(arr == null || arr.length < 2)
return;
for(int end = arr.length-1; end > 0; end--){for(int i = 0; i < end; i++)
if(arr[i] > arr[i+1])
swap(arr,i,i+1);
}
}
选择排序
public static void selectionSort(int[] arr){if(arr == null || arr.length < 2)
return;
for(int i = 0; i < arr.length-1; i++){
int minIndex = i;
for(int j = i+1; j < arr.length; j++)
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
swap(arr, i, minIndex);
}
}
插入排序
public static void insertionSort(int[] arr){if(arr == null || arr.length < 2)
return;
for(int i = 1; i < arr.length; i++)
for(int j = i - 1;j >= 0 && arr[j] > arr[j + 1]; j--)// 一次次往前交换
swap(arr, j, j + 1);
}
对数器
- 随机产生器:产生随机数组
- 准备一个绝对正确的方法:不需考虑时间复杂度,保证绝对正确即可
- 实现比对的方法
- 把方法 a 和方法 b 比对很多次来验证方法 a 是否正确
- 如果有一个样本是的比对出错,打印样本分析是哪个方法出错
- 当样本数量很多时比对测试依然正确,可以确定方法 a 已经正确
以冒泡排序为例
-
随机发生器
public static int[] generateRandomArray(int size, int value){int[] arr = new int[(int) ((size + 1) * Math.random())]; for (int i = 0; i < arr.length; i++) arr[i] = (int)((value + 1) * Math.random()) - (int)(value * Math.random());// 只要是随机数就行 return arr; }
-
准备一个绝对正确的方法
public static void rightMathod(int[] arr){Arrays.sort(arr); }
-
实现比对的方法
// 判断两个数组相等 public static boolean isEqual(int[] arr1, int[] arr2){if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) return false; if (arr1 == null && arr2 ==null) return true; if (arr1.length != arr2.length) return false; for (int i = 0; i < arr1.length; i++) {if(arr1[i] != arr2[i]) return false; } return true; }
-
//Main public static void main(String[] args) { // 自己设置 int testTime = 500000; int size = 10; int value = 100; boolean succeed = true; for (int i = 0; i < testTime; i++){int[] arr1 = generateRandomArray(size,value);// 生成器 int[] arr2 = copyArray(arr1);// 拷贝 arr1 int[] arr3 = copyArray(arr1); bubbleSort(arr1); rightMathod(arr2); if(!isEqual(arr1,arr2)){ succeed = false; printArrays(arr3);// 将错误的样本打印出来 break; } } System.out.println(succeed ? "Nice!" : "Error!"); } // 复制数组 public static int[] copyArray(int[] arr){if (arr == null) return null; int[] res = new int[arr.length]; for (int i = 0; i< arr.length; i++) res[i] = arr[i]; return res; } // 打印样本 public static int[] printArrays(int[] arr){...}