评估算法优劣的核心指标是什么?
- 时间复杂度(流程决定)
- 空间复杂度(流程决定)
- 常数项时间(实现细节决定)
认识对数器
- 你想要测试的方法a
- 实现复杂度不好但容易实现的方法b
- 实现一个随机样本产生器
- 把方法a和方法b跑相同的随机样本,看看得到的结果是否一致
- 如果一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a和方法b
- 当样本数量很多时,比对测试依然正确,可以确定方法a已经正确
选择排序
- 首先在未排序的数组中找到最小元素,存放在数组的起始位置
- 再从剩余的元素中寻找最小元素,放在已排好序的末尾,直到所有排好序
public class SelectionSort {
public static void selectSort(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);
}
}
private static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) ((maxSize) * Math.random());
}
return arr;
}
public static void comparator(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;
}
public static void printArray(int[] arr) {
if (arr == null) {
return;
}
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
public static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] newArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
return newArr;
}
public static void main(String[] args) {
int testTime = 500000;
int maxSize = 100;
int maxValue = 100;
boolean success = true;
for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1);
selectSort(arr1);
comparator(arr2);
if (!isEqual(arr1, arr2)) {
success = false;
printArray(arr1);
printArray(arr2);
break;
}
}
System.out.println(success ? "success" : "failed");
int[] arr = generateRandomArray(maxSize, maxValue);
printArray(arr);
selectSort(arr);
printArray(arr);
}
}