使用插入排序来优化可以这样写吗?

使用插入排序来优化可以这样写吗?

public static <E extends Comparable<E>> void sortBU(E[] arr) {
    E[] temp = Arrays.copyOf(arr, arr.length);
    int n = arr.length;

    for (int size = 1; size < n; size += size) {
    //长度在15之用插入
        if (size <= 15) {
            for (int i = 0; i + size < n; i += size + size) {
                if (arr[i + size - 1].compareTo(arr[i + size]) > 0) {
                    InsertionSort.sort4(arr, i, Math.min(i + size + size - 1, n - 1));
                }
            }
        }
        //长度大于15用归并
        else{
            for (int i = 0; i + size < n; i += size + size) {
                if (arr[i + size - 1].compareTo(arr[i + size]) > 0) {
                    merge2(arr, i, i + size - 1, Math.min(i + size + size - 1, n - 1), temp);
                }
            }
        }

    }
}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2022-07-09 07:30:58

抱歉,这个提问慕课网的系统通知没有提醒到我,我今天查看后台数据才看到。


==========


你的代码可以正确的排序,但是其中做了一部分无用功。


因为你的代码会在 sz = 1, 2, 4, 8 的时候,分别对数组中长度为 2, 4, 8, 16 的子数组做插入排序。这是没有必要的。对长度为 2 的子数组做插入排序,并不能特别帮助对长度为 4 的子数组做插入排序。 我们的优化,只需要对所有长度为 16 的子数组做插入排序,就够了。之后就可以开始归并排序的过程。


请再体会一下课程的代码:https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/10-More-about-MergeSort/07-MergeSort-Bottom-Up-Optimized-by-InsertionSort/src/MergeSort.java


其中 34-35 行只运行了一轮,儿你的代码,在插入排序部分,运行了多轮。


继续加油!:)

  • 我最开始也是这样写的,后来发现老师写的有道理

    2023-12-21 18:52:04
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2628    人
  • 解答问题       1105    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师