我们在学习数据结构的过程中可能会遇到这样的一个问题:当我们写一个排序算法的时候,可能数据样本小的时候我们的程序还是能够正常运行的,但是样本一大就会出各种报错,或者是排序错误。基于这些问题,
对数器
能够帮我们解决这些问题。下面我们来看看对数器
是如何编写的,并且以冒泡排序
进行测试
###对数器
所谓的对数器其实就是帮我们随机生成一个不定长和不定值的数组
废话不多说,直接上代码
1package com.atguigu.datastructure.baseunit1;
2
3import java.util.Arrays;
4
5public class LogarithmicDetector {
6
7 /**
8 * 冒泡排序
9 * @param arr
10 */
11 public static void bubbleSort(int[] arr) {
12 if (arr == null || arr.length < 2) {
13 return;
14 }
15 for (int e = arr.length - 1; e > 0; e--) {
16 for (int i = 0; i < e; i++) {
17 if (arr[i] > arr[i + 1]) {
18 swap(arr, i, i + 1);
19 }
20 }
21 }
22 }
23
24 /**
25 * 交换数组的两个值
26 * @param arr 操作数组
27 * @param i 数组下标
28 * @param j 数组下标
29 */
30 public static void swap(int[] arr, int i, int j) {
31 int temp;
32 temp = arr[i];
33 arr[i] = arr[j];
34 arr[j] = temp;
35 }
36
37 /**
38 * 对数组进行排序, 这个排序一定正确,用于验证我们编写的算法是否正确
39 * @param arr
40 */
41 public static void comparator(int[] arr) {
42 Arrays.sort(arr);
43 }
44
45 /**
46 * 随机生成不定长、不定值的数组
47 * @param maxSize 数组最大长度
48 * @param maxValue 数组最大值
49 * @return
50 */
51 public static int[] generateRandomArray(int maxSize, int maxValue) {
52 int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
53 for (int i = 0; i < arr.length; i++) {
54 arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
55 }
56 return arr;
57 }
58
59 /**
60 * 拷贝数组
61 * @param arr 需要拷贝的数组
62 * @return
63 */
64 public static int[] copyArray(int[] arr) {
65 if (arr == null) {
66 return null;
67 }
68 int[] res = new int[arr.length];
69 for (int i = 0; i < arr.length; i++) {
70 res[i] = arr[i];
71 }
72 return res;
73 }
74
75 /**
76 * 判断两个数组是否相等
77 * @param arr1 源数组
78 * @param arr2 目标数组
79 * @return
80 */
81 public static boolean isEqual(int[] arr1, int[] arr2) {
82 if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {
83 return false;
84 }
85 if (arr1 == null && arr2 == null) {
86 return true;
87 }
88 if (arr1.length != arr2.length) {
89 return false;
90 }
91 for (int i = 0; i < arr1.length; i++) {
92 if (arr1[i] != arr2[i]) {
93 return false;
94 }
95 }
96 return true;
97 }
98
99 /**
100 * 输出数组结果
101 * @param arr 需要打印的数组
102 */
103 public static void printArray(int[] arr) {
104 if (arr == null) {
105 return;
106 }
107 for (int i = 0; i < arr.length; i++) {
108 System.out.print(arr[i] + " ");
109 }
110 System.out.println();
111 }
112
113
114 public static void main(String[] args) {
115 int testTime = 500000;
116 int maxSize = 100;
117 int maxValue = 100;
118 boolean succeed = true;
119 for (int i = 0; i < testTime; i++) {
120 int[] arr1 = generateRandomArray(maxSize, maxValue);
121 int[] arr2 = copyArray(arr1);
122 bubbleSort(arr1);
123 comparator(arr2);
124 // 判断两个排序后的数组是否相等
125 if (!isEqual(arr1, arr2)) {
126 succeed = false;
127 break;
128 }
129 }
130 System.out.println(succeed ? "Nice!" : "Fucking fucked!");
131
132 int[] arr = generateRandomArray(maxSize, maxValue);
133// printArray(arr);
134 bubbleSort(arr);
135 printArray(arr);
136 }
137
138}
善于利用对数器可以极大提高我们算法的正确性哟。
注释都写得很清楚哦,大家慢慢品味~