- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《数据结构》排序
第9章 排 序 9.1 插入排序 9.2 交换排序 9.3 选择排序 9.4 归并排序 习题 排序是针对记录的集合{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn},重组记录之间的关系,使记录的排列次序满足相应的关键字的递增或递减关系。记录的集合也称为待排序序列。若待排序序列完全存放在内存中,则该排序称为内部排序;若由于数据集合太大,在排序过程中,需对外存进行访问,则该排序称为外部排序。 有如下一组待排序序列(每个记录只列出关键字一项): 53,25,67(1),46,29,67(2),89,43,67(3),76 括号里的数字代表等值记录的位置,若排序后为: 25,29,43,46,53,67(1),67(2),67(3),76,89 则称所用的排序方法是稳定的,反之,若三个等值记录的排列顺序不是上述顺序,就称所用排序的方法是不稳定的。 9.1 插入排序 9.2 交换排序 9.3 选择排序 9.4 归并排序 单击此处编辑母版标题样式 单击此处编辑母版副标题样式 9.1.1 直接插入排序 它的基本操作是在处理第i个记录时,前面1到i-1记录已排成有序,将第i个记录插入有序表中,得到一个新的有序表,表的长度加1。当表中只有一个记录时,该表已是有序表,所以,可以从第二个记录开始,逐个插入记录,直至处理完待排序序列的所有记录。 直接插入排序的时间复杂度为O(n2),并且是一种稳定排序。当n较小时,排序的效率较高,是一种常用的排序方法 图9.1 直接插入排序示例 91] 72 67 62 46 35 [29 j=2 i=7 46 91] 72 67 62 35 [29 j=4 i=6 46 72 91] 67 62 35 [29 j=0 i=5 46 72 29 91] 67 62 [35 j=1 i=4 46 72 29 62 91] 67 [35 j=0 i=3 46 72 29 62 35 91] [67 j=0 i=2 46 72 29 62 35 67 [91] j=0 i=1 6 5 4 3 2 1 0 下标 插入位置 处理记录号 例如,有一组关键字序列为{91,67,35,62,29,72,46},直接插入排序过程如图9.1所示。 用C语言描述的直接插入排序算法如下: typedef struct { int key; … /* 其他域 */ } NODE; 算法9.1 直接插入排序算法。 void InsertSort (NODE array[],int n) /* 对存放在数组array[]中,长度为n的序列排序 */ { int i,j; NODE x; for(i=1;in;i++) { x=array[i]; j=i-1; while (j=0 x.keyarray[j].key) { array[j+1]=array[j]; j--; } array[j+1]=x; } } 9.1.2 希尔排序 希尔排序是一种步长递减的插入排序,又称为“缩小增量排序”。该排序方法是,将直接插入分成插入步长由大到小不同的若干趟来进行。初始,步长较大,相当于把待排记录序列分成若干子序列,各子序列中记录的间隔为步长距离,由于子序列的长度小,所以子序列的插入排序的效率较高。以后各趟逐步减小步长,随着步长的减小,子序列的长度在增加,但子序列中包含了上一趟经过大的步长插入排序的结点,因此,已有部分结点有序,这样,在排序中记录移动的次数就少,排序的效率也就高。最后一趟是步长为1,即:对整个序列直接插入排序,但这时整个序列已基本有序,只要做少量记录移动,就可将该序列排成有序。 图9.2 希尔排序示例 例如,有8个关键字序列为{91,67,35,62,29,72,46,57},
文档评论(0)