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
阅读全文
0 0
- 排序3:插入排序(2路插入排序)
- 插入排序(2)
- 插入排序(直接插入排序,折半插入排序,2路插入排序)
- 排序2:插入排序(折半插入排序)
- 排序 : 2 插入排序
- 排序 : 2 插入排序
- 排序2-插入排序
- 算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)
- 2-2 插入排序(3)
- (2)直接插入排序
- 经典排序算法2(插入排序)
- 排序(2)直接插入排序
- 排序算法(2)-直接插入排序
- java排序(2):插入类排序
- 算法排序(2):插入排序
- 插入排序--2路插入排序
- 插入排序之2路插入排序
- 插入排序(直接插入排序,折半插入排序,2路插入排序,希尔排序)
- 第2章 排序基础
- 2-1 选择排序
- 2-2 插入排序(1)
- 2-2 插入排序(2)
- 每日英语阅读(五十六)
- 2-2 插入排序(3)
- Python 函数式编程(一)
- 2-3 冒泡排序
- 让你越来越值钱的秘密:目标清单
- NOIP模拟9.13
- Virus_JS3_PyAnalysisAndSummary
- [树形dp][trie]cf856B Similar Words
- Python函数式编程之lambda
- 知识点1