- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《清华大学数据结构讲义ch10
第10章 排序
10.1基本概念
排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列。作为排序依据的数据项称为“排序码”,也即数据元素的关键码。为了便于查找,通常希望计算机中的数据表是按关键码有序的。如有序表的折半查找,查找效率较高。还有,二叉排序树、B-树和B+树的构造过程就是一个排序过程。若关键码是主关键码,则对于任意待排序序列,经排序后得到的结果是唯一的;若关键码是次关键码,排序结果可能不唯一,这是因为具有相同关键码的数据元素,这些元素在排序结果中,它们之间的的位置关系与排序前不能保持。
若对任意的数据元素序列,使用某个排序方法,对它按关键码进行排序:若相同关键码元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;而不能保持一致的排序方法则称为不稳定的。
排序分为两类:内排序和外排序。
内排序:指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。
外排序:指排序过程中还需访问外存储器,足够大的元素序列,因不能完全放入内存,只能使用外排序。
10.2插入排序
10.2.1直接插入排序
设有n个记录,存放在数组r中,重新安排记录在数组中的存放顺序,使得按关键码有序。即
r[1].key≤r[2].key≤……≤r[n].key
先来看看向有序表中插入一个记录的方法:
设1j≤n,r[1].key≤r[2].key≤……≤r[j-1].key,将r[j]插入,重新安排存放顺序,使得r[1].key≤r[2].key≤……≤r[j].key,得到新的有序表,记录数增1。
【算法10.1】
① r[0]=r[j]; //r[j]送r[0]中,使r[j]为待插入记录空位
i=j-1; //从第i个记录向前测试插入位置,用r[0]为辅助单元, 可免去测试i1。
② 若r[0].key≥r[i].key,转④。 //插入位置确定
③ 若r[0].key r[i].key时,
r[i+1]=r[i];i=i-1;转②。 //调整待插入位置
④ r[i+1]=r[0];结束。 //存放待插入记录
【例10.1】向有序表中插入一个记录的过程如下:
r[1] r[2] r[3] r[4] r[5] 存储单元
2 10 18 25 9 将r[5]插入四个记录的有序表中,j=5
r[0]=r[j];i=j-1; 初始化,设置待插入位置
2 10 18 25 □ r[i+1]为待插入位置
i=4,r[0] r[i],r[i+1]=r[i];i--; 调整待插入位置
2 10 18 □ 25
i=3,r[0] r[i],r[i+1]=r[i];i--; 调整待插入位置
2 10 □ 18 25
i=2,r[0] r[i],r[i+1]=r[i];i--; 调整待插入位置
2 □ 10 18 25
i=1,r[0] ≥r[i],r[i+1]=r[0]; 插入位置确定,向空位填入插入记录
2 9 10 18 25 向有序表中插入一个记录的过程结束
直接插入排序方法:仅有一个记录的表总是有序的,因此,对n个记录的表,可从第二个记录开始直到第n个记录,逐个向有序表中进行插入操作,从而得到n个记录按关键码有序的表。
【算法10.2】
void InsertSort(S_TBL p)
{ for(i=2;i=p-length;i++)
if(p-elem[i].key p-elem[i-1].key) /*小于时,需将elem[i]插入有序表*/
{ p-elem[0].key=p-elem[i].key; /*为统一算法设置监测*/
for(j=i-1;p-elem[0].key p-elem[j].key;j--)
p-
文档评论(0)