这性能相差也太大了吧。。

来源:2-3 插入排序法的一个小优化

认真努力小封同学

2022-02-25 16:42:27

https://img.mukewang.com/climg/6218956e09b6d06407040308.jpg

// sort1
public static <E extends Comparable<E>> void sort(E[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = i; j > 0 && arr[j].compareTo(arr[j - 1]) < 0; j--) {
                swap(arr, j, j - 1);
            }
        }
}

// sort2
public static <E extends Comparable<E>> void sort2(E[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int j;
        for (j = i; j > 0 && arr[i].compareTo(arr[j - 1]) < 0; j--) {
            arr[j] = arr[j - 1];
        }
        arr[j] = arr[i];
    }
}
写回答

1回答

liuyubobobo

2022-02-26

你的 sort2 是错误的。在做课程中介绍的优化的时候,课程官方代码中的 E t = arr[i] 不能省:https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/04-Insertion-Sort/03-Insertion-Sort-Optimized/src/InsertionSort.java


循环中每次是 arr[j - 1] 和 t 作比较,而不是 arr[j - 1] 和 arr[i] 作比较。因为在你的复制过程中,会修改 arr[i] 的值。


用一个小测试用例,实际运行你的 sort2,然后将排序结果打印出来,看看是不是整个数组被修改了?


继续加油!:)

0
认真努力小封同学
hp dir="ltr">好像是哦 我没注意到在第一次循环中i和j是相等的 如果改变了arr[j]就等于改了arr[i],那么后面的比较就已经是错误的了 :(

h022-02-26
共1条回复

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2584 学习 · 1063 问题

查看课程