当前位置:首页 > 科技  > 软件

【排序算法】-折半插入排序

来源: 责编: 时间:2023-10-06 19:19:23 391观看
导读基本思想先来回顾一下直接插入排序的算法思想,就是在前面已经排好序的子序列中寻找一个待插入的位置,然后将待插入元素插入到该位置上。其中寻找插入位置的过程我们是与每一个元素进行比较,相当于顺序查找,我们知道顺序查

基本思想

先来回顾一下直接插入排序的算法思想,就是在前面已经排好序的子序列中寻找一个待插入的位置,然后将待插入元素插入到该位置上。Yje28资讯网——每日最新资讯28at.com

其中寻找插入位置的过程我们是与每一个元素进行比较,相当于顺序查找,我们知道顺序查找的效率是比较低的,那么有没有办法能够提高查找插入位置的效率呢?Yje28资讯网——每日最新资讯28at.com

很巧的是,前面的序列既然已经是有序的了,我们何不采用折半查找来找出插入位置呢?折半查找的前提就是序列有序,采用折半查找法查找插入位置的插入排序算法,我们称其为折半插入排序。Yje28资讯网——每日最新资讯28at.com

图解排序过程

折半插入算法非常简单,前提你得掌握直接插入排序和折半查找的算法,来看一个例子:Yje28资讯网——每日最新资讯28at.com

Yje28资讯网——每日最新资讯28at.com

原序列的前四个元素已经有序,则从i位置元素开始进行插入排序,先将i位置元素存入下标0作为哨兵,然后在子序列中寻找待插入位置。Yje28资讯网——每日最新资讯28at.com

这时我们可以采用折半查找法进行查找,定义三个变量lowhighmid,初始low = 1high = i -1,则mid为2Yje28资讯网——每日最新资讯28at.com

让哨兵位置元素值与mid位置元素值比较,7大于5,所以插入位置应该在右半区,让low = mid + 1high不变,继续折半查找:Yje28资讯网——每日最新资讯28at.com

Yje28资讯网——每日最新资讯28at.com

此时high大于low,查找结束,则插入位置即为high + 1,这些都是折半查找的内容,这里不赘述。Yje28资讯网——每日最新资讯28at.com

找到了插入位置为high + 1,可不能直接将待插入元素值存入high + 1位置,这样会覆盖原先的元素值,而应该从high + 1位置开始,到i - 1位置为止,将该范围内的所有元素后移,空开high + 1位置,最后将哨兵位置元素插入到high + 1位置即可。Yje28资讯网——每日最新资讯28at.com

代码实现

先构建待排序序列:Yje28资讯网——每日最新资讯28at.com

public class ElemType {    int key;}public class SSTable {    ElemType[] n;    int length;    public SSTable() {        this.length = 11;        this.n = new ElemType[this.length + 1];        for (int i = 1; i <= this.length; i++) {            this.n[i] = new ElemType();        }        this.n[1].key = 3;        this.n[2].key = 5;        this.n[3].key = 10;        this.n[4].key = 16;        this.n[5].key = 7;        this.n[6].key = 32;        this.n[7].key = 83;        this.n[8].key = 23;        this.n[9].key = 54;        this.n[10].key = 29;        this.n[11].key = 96;    }}

折半插入排序算法如下:Yje28资讯网——每日最新资讯28at.com

public class Main {    public static void BInsertSort(SSTable t) {        int i, j, low, high, mid;        //从第二个元素开始插入排序        for (i = 2; i <= t.length; ++i) {            //将待插入元素存入哨兵位置            ElemType temp = t.n[i];            //为low和high赋初值            low = 1;            high = i - 1;            while (low <= high) {                mid = (low + high) / 2;                if (temp.key < t.n[mid].key) {                    high = mid - 1;                } else {                    low = mid + 1;                }            }            //将high + 1到i - 1的元素后移            for (j = i - 1; j >= high + 1; --j) {                t.n[j + 1] = t.n[j];            }            //将哨兵位置元素插入j + 1位置            t.n[j + 1] = temp;        }    }    public static void main(String[] args) {        SSTable st = new SSTable();        BInsertSort(st);    }}

性能分析

可以肯定的是,折半插入排序的效率是要高于直接插入排序的,它所需要的关键码比较次数与待排序对象序列的初始排列无关,仅依赖于对象个数。在插入第i个对象时,需要经过「log2i」 + 1次关键码比较才能确定插入位置。Yje28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-12133-0.html【排序算法】-折半插入排序

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 突破性能边界,OpenSwoole 引领 PHP 网络编程新时代!

下一篇: 推荐八个上热搜的GitHub开源项目

标签:
  • 热门焦点
  • 女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    近日,江苏苏州一女孩租房当天充值了100元电费,开着空调不到2小时发现电费已用完。对于为什么这个快,房东表示,电表坏了这种情况很多,之前也遇到过,给租客换
  • JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 十个简单但很有用的Python装饰器

    装饰器(Decorators)是Python中一种强大而灵活的功能,用于修改或增强函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为参数,并返回一个新的函数或类。它们通常用
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 年轻人的“职场羞耻感”,无处不在

    作者:冯晓亭 陶 淘 李 欣 张 琳 马舒叶来源:燃次元&ldquo;人在职场,应该选择什么样的着装?&rdquo;近日,在网络上,一个与着装相关的帖子引发关注,在该帖子里,一位在高级写字楼亚洲金
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top