插入排序:表折半插入

    在前一篇插入排序:表插入中。我们用静态链表的存储方式。直接插入的策略,构建了一种新的插入排序算法:表插入。

有人可能会想到:相同是静态链表的形式,为什么不使用更高效的折半插入策略呢?这样的想法真的非常好,假设做到了。显然是极大的优化。

    我在网上还真看到了相关的内容,大家可搜下《表插入方法的改进》,里面有此想法的介绍。这篇博客就是介绍表插入的还有一种实现:表折半插入。看完一定让你彻底理解它!

与一般的折半插入相比,有例如以下的几点变化:

  1. 为了实现折半查找,我们对静态链表的节点类型做了一些变化:加入了一个前驱指针。

    它的意义非常显然,曾经是high=mid-1,在单向链表中我们是做不到的(事实上能够换种方式做到,只是相对麻烦),于是加入一指向其前驱的指针。构成双向链表,方便进行此操作。

  2. while循环的结束条件,有所不同。这个要细致理解!
其它细节,代码中有详解
const int MAX=100;
typedef struct rec
{int data;int pre;   //前驱 int next;  //后继 
}Rec;
void InsertSort(int a[], int n)  //表折半插入 
{Rec *rec=new Rec[n+1];for(int i=0; i<n; i++){rec[i+1].data=a[i];rec[i+1].next=rec[i+1].pre=0;}rec[0].data=MAX;rec[0].next=rec[0].pre=1;int low,high,mid;int p,k,l;for(int i=2; i<n+1; i++){//依据下面的赋值,我们能够看出。这里使用的是左闭右闭区间 low=rec[0].next;    //low指向最小的 high=rec[0].pre;    //high指向最大的 l=i-1;      //已有序的元素个数 while(low!=0 && high!=0 && rec[low].data<=rec[high].data)  //循环结束条件得理解,特别是前两个条件。

准确的是。第一个条件能够不要 { mid=low; k=1; l/=2; // l>>=2 减半。为下次循环做好准备 while(k<l) //寻找mid位置 { mid=rec[mid].next; k++; } if(rec[i].data<rec[mid].data) high=rec[mid].pre; else low=rec[mid].next; } //插入第i个节点。相似于双向链表的插入 rec[rec[low].pre].next=i; rec[i].pre=rec[low].pre; //加入前驱指针的作用体如今这里 rec[i].next=low; rec[low].pre=i; } //顺着next指针方向打印 printf("表折半插入排序后\n"); p=rec[0].next; while(p!=0) { printf("%-4d",rec[p].data); p=rec[p].next; } printf("\n"); }


细致看完代码,我想大多数人仅仅剩一个问题可能没明确,那就是while循环的结束条件为什么还得加上low!=0high!=0
为了解释清楚。我们画一个图,图中正在插入i=2的节点:
初始化后。low,mid,high显然都指向1,经过下一步rec[i].data与rec[mid].data比較后,不管结果如何,循环都应结束。

可假设

rec[i].data<rec[mid].data,就有high=rec[mid].pre,即high=1.此时显然有rec[low]<rec[high],也就是说循环还得接着经进行下去。问题就出在这里!讲到这里,你应该明确:即使出现low为0,它也会违反第三条件:rec[low].data<=rec[high].data)(由于rec[0]的值域是最大的)。这就是为什么说,第一个条件low!=0能够去掉。

到此。你应该明确了代码中全部的凝视。


測试走起啊……

p.s 对rec数组1-n号元素进行重排也是能够的,做法參照上一篇博客哦,方法一模一样。

转载请注明出处,本文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/28635157

若是写得好。顶一个哦。

代码就是折腾,越折腾越进步!


专栏文件夹看这里:
  • 数据结构与算法文件夹
  • c指针


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++编译报错:重复定义

http://note.youdao.com/noteshare?idcb2bed862a2daae89775603168f297af转载于:https://www.cnblogs.com/taiyang-li/p/6637093.html

【机器学习】sklearn实现---归类为5大类

sklearn实现---归类为5大类 sklearn.preprocessing.scale()&#xff08;最常用&#xff0c;易受异常值影响&#xff09;sklearn.preprocessing.StandardScaler()sklearn.preprocessing.minmax_scale()&#xff08;一般缩放到[0,1]之间&#xff0c;若新数据集最大最小值范围有变…

关于安装deepin+window10双系统有时没有声音的问题

关于安装deepinwindow10双系统有时没有声音的问题 这个问题小编目前还没有解决,求大神帮忙! deepin社区官网:深度科技社区 还可以参考一下其他的教程 深粉交流:新手刚刚安装好DEEPIN&#xff0c;但没有声音&#xff0c;怎而解决&#xff1f; 冰封飞飞(云网牛站):在Deepin系统中…

如何读H.264的标准和代码

首先&#xff0c;还是要弄清楚编解码的流程和 H.264 的关键技术&#xff0c;看白皮书就知道了&#xff0c;另外 H.264 综述类的文章和别人的学位论文一般也会讲到&#xff1b; 其次&#xff0c;弄清楚代码的各个函数实现的功能&#xff0c;这个可以看看 JM 代码里各个函数前面的…

Kafka官方文档翻译——实现

IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer&#xff1a; kafka.producer.SyncProducerkafka.producer.async.AsyncProducerclass Producer {/* Sends the data, partitioned by key to the topic using either the *//* synchronous or t…

【机器学习】熵、决策树、随机森林 总结

一、熵 公式&#xff1a; −∑i1np(xi)∗log2p(xi)-\sum_{i 1}^{n}{p(xi)*log_2p(xi)}−i1∑n​p(xi)∗log2​p(xi) ∑i1np(xi)∗log21p(xi)\sum_{i1}^{n}p(xi)*log_2\frac{1}{p(xi)}i1∑n​p(xi)∗log2​p(xi)1​ import numpy as np# 账号是否真实&#xff1a;3no&#xff…

HDU 4857 逃生(拓扑排序)

拓扑排序 一.定义 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序&#xff0c;是将G中所有顶点排成一个线性序列&#xff0c;使得图中任意一对顶点u和v&#xff0c;若<u&#xff0c;v> ∈E(G)&#xff0c;则u在线性序列中出现在v之前。 通常&#xff0c;…

关于deepin系统安装design compiler的问题解答

关于deepin系统安装design compiler的问题解答 Design Compiler是Synopsys综合软件的核心产品。它提供约束驱动时序最优化&#xff0c;并支持众多的设计类型&#xff0c;把设计者的HDL描述综合成与工艺相关的门级设计&#xff1b;它能够从速度、面积和功耗等方面来优化组合电…

iOS 数据持久化-- FMDB

一、简介 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象&#xff0c;省去了很多麻烦、冗余的C语言代码 对比苹果自带的Core Data框架&#xff0c;更加轻量级和灵活 提供了多线程安全的数据库操作方法…

【机器学习】交叉验证筛选参数K值和weight

交叉验证 导包 import numpy as npfrom sklearn.neighbors import KNeighborsClassifierfrom sklearn import datasets#model_selection &#xff1a;模型选择 # cross_val_score: 交叉 &#xff0c;validation&#xff1a;验证&#xff08;测试&#xff09; #交叉验证 from s…

jqGrid列的统计

$("#List").jqGrid({ url: "${pageContext.request.contextPath}/cbfx/getCbhzList.do", datatype: "json", mtype: GET, colNames:["成本类别","费用","去年同期费用","备注"], colMod…

手机只能签荣耀!最忠诚代言人胡歌喊你去天猫超品日

在你心中&#xff0c;男神胡歌是什么样子&#xff1f;“御剑乘风来&#xff0c;除魔天地间。”也许是《仙剑奇侠传》里飞扬跋扈、青春不羁的侠客李逍遥。“遍识天下英雄路&#xff0c;俯首江左有梅郎。”也许是《琅铘榜》中才智冠天下&#xff0c;远在江湖却名动帝辇的麒麟才子…

欧式距离与曼哈顿距离

欧式距离&#xff0c;其实就是应用勾股定理计算两个点的直线距离 二维空间的公式 其中&#xff0c; 为点与点之间的欧氏距离&#xff1b;为点到原点的欧氏距离。 三维空间的公式 n维空间的公式 曼哈顿距离&#xff0c;就是表示两个点在标准坐标系上的绝对轴距之和&#xff1a…

在maven pom.xml中加载不同的properties ,如localhost 和 dev master等jdbc.properties 中的链接不一样...

【参考】&#xff1a;maven pom.xml加载不同properties配置[转] 首先 看看效果&#xff1a; 点开我们项目中的Maven projects 后&#xff0c;会发现右侧 我们profile有个可勾选选项。默认勾选localhost。localhost对应项目启动后&#xff0c;会加载配置左侧localhost文件夹下面…

4.8-全栈Java笔记:包机制

包机制是java中管理类的重要手段。 开发中&#xff0c;我们会遇到大量同名的类&#xff0c;通过包我们很容易对解决类重名的问题&#xff0c;也可以实现对类的有效管理。 包对于类&#xff0c;相当于&#xff0c;文件夹对于文件的作用。package我们通过package实现对类的管理&a…

python安装以及版本检测

Windows 安装 Python 3 目前Python有两个大版本&#xff0c;分别是 2.X 和 3.X &#xff0c;我们的教程基于最新版本 3.6.1 首先我们需要获取Python的安装包&#xff0c;可以从官网获取&#xff0c;如果你因为没有VPN工具而无法访问官网的话&#xff0c;我已经将它放在网盘了&…

【机器学习】梯度下降原理

import numpy as np import matplotlib.pyplot as plt %matplotlib inlinef lambda x :(x-3)**22.5*x-7.5 f2 lambda x :-(x-3)**22.5*x-7.5求解导数 导数为0 取最小值 x np.linspace(-2,5,100) y f(x) plt.plot(x,y)梯度下降求最小值 #导数函数 d lambda x:2*(x-3)*12.…

C语言的面向对象设计-对X264/FFMPEG架构探讨

本文贡献给ZSVC开源社区&#xff08;https://sourceforge.net/projects/zsvc/&#xff09;&#xff0c;他们是来自于中国各高校的年轻学子&#xff0c;是满怀激情与梦想的人&#xff0c;他们将用自己的勤劳与智慧在世界开源软件领域为中国留下脚步&#xff0c;该社区提供大量视…

linux gtest安装

1. 安装cmake, 具体步骤这里不详说。 2. 下载源码&#xff1a;https://codeload.github.com/google/googletest/zip/release-1.8.0 3. 解压源码&#xff1a;unzip googletest-release-1.8.0.zip 4. 进入源码目录&#xff1a;cd googletest-release-1.8.0 5. 创建并进入目录buil…

基于物联网的智能垃圾桶设计

前言 目前我国各城市包括首都正在深入开展争创国家卫生城市活动&#xff0c;这是全国爱国卫生运动委员会办公室评选命名的国家级卫生优秀城市的最高荣誉&#xff0c;是一个城市综合素质的重要标志。沈阳市正在深入开展创建国家卫生城市和建设国家健康城市(以下简称“双城双创”…