对数器

我们在学习数据结构的过程中可能会遇到这样的一个问题:当我们写一个排序算法的时候,可能数据样本小的时候我们的程序还是能够正常运行的,但是样本一大就会出各种报错,或者是排序错误。基于这些问题,对数器能够帮我们解决这些问题。下面我们来看看对数器是如何编写的,并且以冒泡排序进行测试

###对数器
所谓的对数器其实就是帮我们随机生成一个不定长和不定值的数组
废话不多说,直接上代码

  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}

善于利用对数器可以极大提高我们算法的正确性哟。
注释都写得很清楚哦,大家慢慢品味~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值