算法导论——归并排序和插入排序的结合版本 java

结合归并排序和插入排序 Merge with Insertion Sort 对n(2的整数幂个数字进行排序, 阅读详情

merge排序和insert排序的结合版本,当归并排序把数组分解的足够小的时候,可以在局部对小数组进行插入排序从而提高整个算法的性能:
k取lg(n)

public class MergeAndInsert {
    public static void mergeAndInsertSort(int[] array, int from, int to) {
        if (to - from + 1 <= lg(array.length)) {
            insertionSort(array, from, to);
        } else {
            int middle = (int) Math.floor((to + from) / 2);
            mergeAndInsertSort(array, from, middle);
            mergeAndInsertSort(array, middle + 1, to);
            merge(array, from, middle, to);
        }
    }
    private static void insertionSort(int[] array, int from, int to) {
        for (int i = from + 1; i <= to; i++) {
            int key = array[i];
            int j = i - 1;
            while (j >= from && key < array[j]) {
                array[j + 1] = array[j];
                j--;
            }
            array[j + 1] = key;
        }
    }
    private static void merge(int[] array, int from, int middle, int to) {
        int[] leftArray = new int[middle - from + 1];
        int[] rightArray = new int[to - middle];
        for (int i = 0; i < leftArray.length; i++) {
            leftArray[i] = array[from + i];
        }
        for (int i = 0; i < rightArray.length; i++) {
            rightArray[i] = array[middle + i + 1];
        }
        int idxL = 0;
        int idxR = 0;
        for (int idx = from; idx <= to; idx++) {
            if (leftArray[idxL] <= rightArray[idxR]) {
                array[idx] = leftArray[idxL];
                idxL++;
                if (idxL == leftArray.length) {
                    copyRest(array, idx + 1, rightArray, idxR);
                    return;
                }
            } else {
                array[idx] = rightArray[idxR];
                idxR++;
                if (idxR == rightArray.length) {
                    copyRest(array, idx + 1, leftArray, idxL);
                    return;
                }
            }
        }
    }
    /**
     * 把oriArr数组中的内容从oIdex开始复制到desArr中,从dIdx开始复制
     */
    private static void copyRest(int[] desArr, int dIdx, int[] oriArr, int oIdx) {
        for (; oIdx < oriArr.length; oIdx++) {
            desArr[dIdx] = oriArr[oIdx];
            dIdx++;
        }
    }
     //计算以2为底的对数
    private static double lg(double n) {
        return Math.log(n) / Math.log(2);
    }
}
算法导论 2-1 在归并排序中引入插入排序 (在归并排序中对小数组采用插入排序)虽然归并排序的最坏情况运行时间为θ(nlgn),而插入排序的最坏运行时间为θ(),但是插入排序中的常量因子可能使得它在n较小时,在许多机器上实际运行得更快。因此,在归并排序中当子问题变得足够小时,采用插入排序来使递归的叶变粗是有意义的。考虑对归并排序的一种修改,其中使用插入排序来排序长度为k的n/k个子表,然后使用标准的合并机制来合并这些子表,这里k是一个待定的值。 a. 证明:插入排序最坏情况可以在θ(nk)时间内排序每个长度为k的n/k个子表。 b. 表明在最坏情 阅读详情

相关推荐

八大排序之插入排序和归并排序

直接插入排序的特性总结:1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定。

冷兮雪的博客 1581

算法导论学习之插入排序+合并排序

最近准备花时间把算法导论详细的看一遍,强化一下算法和数据结构的基础,将一些总结性的东西写到博客上去。一.插入排序 算法思想:如果一个数组A,从A[1–n-1]都是有序的,然后我们将A[n]插入到A[1–n-1]的某个合适的位置上去那么就可以保证A[1–n]都是有序的。这就是插入排序的思想;具体实现的时候我们将数组的第一个元素看出有序,然后从第二个元素开始按照上面的步骤进行插入操作,直到插入

荒野孤鹰 1159

MIT经典算法导论课程笔记精要整理

MIT《算法导论》(Introduction to Algorithms)公开课以严谨的理论体系和深刻的工程洞见著称,被誉为计算机科学领域的“算法圣经”。其教学逻辑围绕分治、动态规划、贪心、图遍历等核心范式展开,强调算法设计与分析的形式化方法。课程不仅涵盖基础排序与查找,更深入探讨数据结构优化与复杂性理论边界。

weixin_36282234的博客 987

c++ 插入排序和归并(合并)排序

插入排序: 插入排序思想:考虑第i个元素,这时候前i-1个元素是有序的,这时候只要将第i个元素放到合适的位置即可。 伪代码: void InsertSort(vector<int>& a){ for(int i=1;i<a.size();++i){ int key = a[i]; int j = i-1; while(j>=0 && a[j] > key){ a[

zhangqianqian57的博客 304

STM32嵌入式开发实战:如何用miniLZO压缩算法节省70%存储空间(附完整工程)

本文详细介绍了如何在STM32嵌入式开发中使用miniLZO无损压缩算法实现高达70%的存储空间节省。通过对比分析不同轻量级算法,重点讲解miniLZO的内存优化配置、分块压缩策略和完整工程实现,帮助开发者有效解决嵌入式系统中的存储瓶颈问题。

ss78901的博客 881

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1461

归并排序相关知识及算法导论第三版2.3-7实现

2.3-7描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素。分析:首先将S进行排序,然后再通过查找算法进行查找。插入排序算法复杂度最差n^2,归并排序最差为nlgn,堆排序为最差为nlgn,快速排序最差为n^2,这里我们直接使用归并排序。所以实现归并排序是第一步。第二步为查找算法,且复杂度不低于nlgn的。首先想到每个数减去...

Oliver_LJF的博客 562

Java 多线程(1)---- 初识线程

前言 多线程想必大家都不会陌生。因为在日常使用和开发中,多线程的使用实在是太常见了。我们都知道,发明多线程的目的是为了更好的利用计算机的 CPU 资源。比如在一个进程中如果只有一个线程(也叫主线程),那么如果当这个线程因为某种原因阻塞(等待用户输入数据等情况)的时候,那么相对应的这个进程也让出了 CPU 资源并暂停执行了。试想一下,如果我们在一个进程中添加多个线程,那么当这个进程中某个线程阻塞的...

指点 1543

《算法导论》读书笔记

注意点: 通俗的讲的时候,就是个人的理解了,仅作参考。 作为一个Java程序员,有必要了解算法,如果有成为一个优秀程序员的想法,算法和数据结构只是基础。当然对于非CS专业,计算机网络,操作系统,编译原理等也是后面需要补充的基础知识点。 关于阅读《算法导论》的一些建议: 不必纠结于数学的证明,例如递归表达式的时间复杂度计算;把一些当前重要的知识点(比如从第一部分到动态规划、贪心算法,高级数据结构...

weixin_30852367的博客 924

SAP Workflow 工作流开发步骤总结

SAP WORKFLOW

qq_36952606的博客 5091

[RK3568 Android11] 开发之默认授予系统预置的APP权限

目录 一、系统预置的APP权限 二、默认授予系统预置的APP权限 一、系统预置的APP权限 1、在打开系统预置的APP时,都会弹窗提示,并且需要人工确定授予权限; 2、有些客户对定制有需求,需要系统预置的APP自动默认授予权限; 二、默认授予系统预置的APP权限 注意此方法只对系统预置的APP起效果,后期手动安装的APP无效; 修改文件: frameworks/base/services/core/java/com/android/server/pm/per...

~未来可期~ 5059

麻省理工公开课算法导论(二):Insertion Sort and Merge Sort

文章目录IntroductionInsertion Sort and Merge SortWhy Sorting?Insertion SortBinary Insertion SortMerge SortSummary Introduction 本篇来自于笔者学习MIT的公开课算法导论的学习笔记,仅仅是我个人接受课程教育后,进行的学习笔记,可能理解并不到位,仅供参考。 课程视频地址: Lectur...

wtopps的专栏 707

基于STM32设计的便携式心电信号监测系统_146

基于STM32 设计的便携式心电信号监测系统,采用 PulseSensor 心率传感器进行数据采集,通过 LCD 显示屏显示心电数字数据和采集状态。同时,该系统还采用 HC05 蓝牙模块将实时心电信号数据传输到手机 APP,用户可以在手机 APP 上实时查看采集的数据并绘制心率曲线。此外,STM32 上的按键可以控制心率采集状态,用户登录手机 APP 还可以查看实时心电信号折线图。

1万+

算法导论读书笔记(2)

算法导论读书笔记(2) 目录 分治法 归并排序 分治法分析 归并排序算法的分析 练习 2.3-2 2.3-4 2.3-5 2.3-7 思考题 在归并排序中对小数组采用插入排序 逆序对 脚注 分治法 算法设计的方法有很多。插入排序 使用的是 增量 (incremental)方法...

weixin_30398227的博客 96

7.12真题华为OD机试真题 新系统 - 字符串压缩编码 (Java/Py/C/C++/Js/Go)

7.12真题华为OD机试真题 新系统 - 字符串压缩编码 (Java/Py/C/C++/Js/Go)

算法大师! 835

嵌入式工程师成长之路(1)——元件基础(试读版)

上拉电阻阻值选错导致MCU反复重启?0欧电阻竟然能“背锅”信号干扰?高精密采样电阻的温漂毁了整个控制系统?——这些问题,都是基础不牢!优快云硬件领域头部博主十年经验汇总,涵盖电阻分类、封装、实战选型、避坑指南,附带职业进阶路径,助你从小白进阶为“电路医生”!

云轩阁 34万+

浅谈排序算法

浅谈排序算法 首先介绍一个大佬的算法学习网站:小浩算法 他的这个算法网站在Git星星之多,啧啧,顺便一提我还在他的分群里(笑)~ 前段时间按他的分类刷了下leetcode,整个人感觉升华了一般,啊,那个快感啧啧… 以下贴出排序算法的java代码实现,并且介绍一下基本概念。 插入排序: 插入排序就好似整理扑克牌一般,每次的插入都一个个与元素比较,放入合适的位置。 图取自算法导论 左边遍历过排完序的数组就是一个循环不变式。 private static int[] insert_sort_ASC(in

qq_43811135的博客 531

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

堆排序

在《算法导论》第3版第6章讲解了堆排序算法 1:初始时候,利用 build_max_heap 将输入数组 A[0..n-1] 建成最大堆 2:因为数组中的最大元素总在根结点 A[0] 中,把它与 A[n-1] 互换,从而让该元素放到正确的位置。 3:这时候,从堆中去掉结点 n-1(–heap_size),剩余的结点中,原来根的孩子结点仍然是最大堆,而新的根结点 可能会违背最大堆的性质。为了...

涛爸的博客 231

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

总结指南:从入门到精通的排序算法学习路径与资源推荐

排序算法是编程的基石,本路径从简单实现到高级优化,循序渐进。关键是多实践:通过编写代码、解决LeetCode题目,并分析性能(如使用大O符号)。平均每天投入1-2小时,3-6个月可达到精通水平。记住,理论结合实践是核心——动手实现算法比单纯阅读更有效。开始你的学习之旅吧,遇到问题随时回顾资源!

2501_94074668的博客 1734

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

「算法与数据结构」从入门到进阶整理推荐书单

一.入门系列 这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。 很适合在闲暇之余拿出来阅读一番。 1.1 《啊哈!算法》 阅读链接:https://book.douban.com/subject/25894685/ 这不过是一本有趣的算法书而已。和别的算...

weixin_33704591的博客 2223

书籍-Sedgewick+Wayne《算法》

《算法》是一本理论与实践完美结合的经典教材,系统地介绍了计算机科学中的基础算法和数据结构。全书分为六个主要部分:基础知识部分涵盖Java编程基础、抽象数据类型、算法分析科学方法;排序算法部分深入讲解初级排序、归并排序、快速排序及其性能分析;数据结构部分详细介绍优先队列、符号表、平衡查找树等核心数据结构;图算法部分全面覆盖无向图和有向图的遍历、连通性分析;字符串处理部分专门讨论字符串排序、模式匹配、正则表达式和数据压缩;高级话题部分探讨正则表达式、数据压缩等复杂算法。每个算法都配有完整的Java实现、详细的性

d3y1`5 81_09 861

python与c语言初学者看什么书_「算法与数据结构」从入门到进阶吐血整理推荐书单...

一.入门系列这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。很适合在闲暇之余拿出来阅读一番。1.1 《啊哈!算法》这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它。推荐理由: 本书中涉及到的数据结构有栈、队列、链...

weixin_39631951的博客 387

python数据结构推荐书-「算法与数据结构」从入门到进阶吐血整理推荐书单

推荐一下「算法与数据结构」从入门到进阶的书单。一.入门系列这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。很适合在闲暇之余拿出来阅读一番。1.1 《啊哈!算法》image这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能...

weixin_37988176的博客 1412

学习算法应该看什么书?从入门书籍到大神专用,本文已为你打包!

一.入门系列 这些书籍通过图片、打比方等通俗易懂的方法来讲述,让你能达到懂一些基础算法,线性表,堆栈,队列,树,图,DP算法,背包问题等,不要求会实现,但是看过以下这些书对于之后实现算法打下坚实的思维基础。 很适合在闲暇之余拿出来阅读一番。 1.1 《啊哈!算法》 这不过是一本有趣的算法书而已。和别的算法书比较,如果硬要说它有什么特点的话,那就是你能看懂它。 推荐理由:本书中涉及到的数据结构有栈、队列、链表、树、并查集、堆和图等;涉及到的算法有排序、枚举、深度和广度优先搜索、图的遍历,当然还有

致力于C语言C++知识分享! 4238

java常用算法手册 第3版 源代码_学习java数据结构,推荐什么书?

这里我推荐7本关于java数据结构的书籍,希望对您有多帮助《大话设计模式》豆瓣对这本书评分很高,出于对《大话设计模式》的好感,读完这本书,总体的感觉是难度低于严老师的书。当然从本书的定位来说是完全可以理解的,本书是一本“入门”、“便于自学”的数据结构书,从这个角度来说,说是国内第一本讲解清楚,看起来非常轻松的数据结构入门书一点都不为过。作者也在前言里说过了,本书的定位就是“入门”。对于自学数据结构...

weixin_39842029的博客 252
上一篇: 算法导论学习
下一篇: mysql 排序后 分页 第一页数据和第二页数据部分数据重复问题
happytaohaha
博客等级 码龄9年 37粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值