2-2 插入排序(3)

来源:互联网 发布:淘宝企业店铺需要什么 编辑:程序博客网 时间:2024/06/16 11:23

关于插入排序优化版的说明

插入排序的优化版因为有赋值的操作,很可能出现的一种结果是,最后得到的数组是排序正确的,但是由于边界值,临界点的选择不对,导致数组的元素被更改。这一点要极为小心。

因此,我们要注意,在我们的排序算法实现中不应该改变数组中的元素。这一点可能一开始看起来觉得是“理所当然”,然在我们真正去实现算法的时候,很可能会踩到这个坑。

比较下面这两版插入排序:

版本1:

@Overridepublic void sort(int[] arr) {    int len = arr.length;    for (int i = 1; i < len; i++) {        // 先把这个元素存一下        int temp = arr[i];        int j = i - 1;        for (; j >= 0; j--) {            // 只要它前面的元素比自己大,就后移            if (arr[j] > temp) {                arr[j + 1] = arr[j];            } else {                break;            }        }        arr[j + 1] = temp;    }}

版本2:

@Overridepublic void sort(int[] arr) {    for (int i = 1; i < arr.length; i++) {        int temp = arr[i];        int j;        for (j = i; j > 0 && arr[j - 1] > temp; j--) {            arr[j] = arr[j - 1];        }        arr[j] = temp;    }}

两种写法其实是一模一样的,但是如果对于临界值边界值的选择不小心的话,很可能出现得到是是一个与原来数组不同的排好序的数组。

因为这种优化的思路有更改元素的风险。而原来的思路只是在拼命交换元素,这种风险很小。

如何避免这个问题呢?加强测试用例的编写。

测试代码:

@Testpublic void test04_1() {    int[] randomArray1 = SortTestHelper.generateRandomArray(5000, 1, 500000000);    int[] randomArray2 = SortTestHelper.copyFromOldArray(randomArray1);    int[] randomArray3 = SortTestHelper.copyFromOldArray(randomArray1);    SortTestHelper.testSortEfficiency(new InsertSort(), randomArray1);    SortTestHelper.testSortEfficiency(new InsertSortOptimize1(), randomArray2);    SortTestHelper.testSortEfficiency(new InsertSortOptimize1_1(), randomArray3);    SortTestHelper.testSorted(randomArray1);    SortTestHelper.testSorted(randomArray2);    SortTestHelper.testSorted(randomArray3);    boolean judgeArrayEquals1 = SortTestHelper.judgeArrayEquals(randomArray1, randomArray2);    boolean judgeArrayEquals2 = SortTestHelper.judgeArrayEquals(randomArray2, randomArray3);    System.out.println(judgeArrayEquals1);    System.out.println(judgeArrayEquals2);}

执行结果:

您所使用的排序算法是 => insert sort

排序算法耗时 => 0.033 秒

您所使用的排序算法是 => insert sort 的优化

排序算法耗时 => 0.011 秒

您所使用的排序算法是 => insert sort 的优化

排序算法耗时 => 0.008 秒

给定数组按照升序排序!

给定数组按照升序排序!

给定数组按照升序排序!

true

true

原创粉丝点击