我们在测试算法的时候不是总有完整的测试数据,但是我们大部分可以使用暴力去实现,对数器的含义在于使用相对可靠的暴力算法,使用很多次随机测试, 测试其算法输出结果是否相同,多次测试结果相同我们认为待测试算法是可靠的。
package sort; import java.util.Arrays; import java.util.Comparator; /** * @author rx * @date 2022/7/25 20:14 */ public class Util{ public static int[] generateRandomArray(int maxSize, int maxValue) { //Math.random()->[0,1)所有小数,等概率返回一个 //Math.random()*N->[0,N) 所有小数,等概率返回一个 //(int)(Math.random()*N->[0,N-1] 所有整数,等概率返回一个 //长度随机 int[] arr = new int[(int) (Math.random() * (maxSize + 1))]; for (int i = 0; i < arr.length; i++) { arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue); } return arr; } 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 void insertionSort(int[] arr) { for (int i = 0; i < arr.length; i++) { int minIndex = i; for (int j = i; j < arr.length; j++) { minIndex = arr[minIndex] > arr[j] ? j : minIndex; } swap(arr, minIndex, i); } } public static boolean isEqual(int[] arr1, int[] arr2) { int len = arr1.length; for (int i = 0; i < len; i++) { if (arr1[i] != arr2[i]) { return false; } } return true; } public static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void comparator(int[] arr) { Arrays.sort(arr); } 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); insertionSort(arr1); comparator(arr2); if (!isEqual(arr1, arr2)) { success = false; break; } } System.out.println(success ? "Nice" : "defeat"); } }