数据结构课件C++版第九章排序幻灯片.ppt

数据结构课件C++版第九章排序幻灯片.ppt

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
13 49 76 38 49’ 97 65 27 65 49 76 38 97 49’ 13 27 27 13 76 38 49’ 97 65 49 例:{49,38,65,97,76,13,27,49’} 9.4 选择排序 5.堆排序过程(见书P281-282) 堆排序是不稳定的,时间复杂度为O(nlogn)。 9.5 归并排序 ⒈ 归并概念:把 2 个有序子文件合并成一个有序文件的过程,称为2-路归并。 归并排序基本思想:⑴将文件的每个记录视为一个有序子文件;⑵然后两两子文件进行2-路归并;⑶重复⑵,直到只剩一个长度为n的有序文件 例:初始关键字:49 38 65 97 76 13 27 49’ 第一趟后 38 49 65 97 13 76 27 49’ 第二趟后 38 49 65 97 13 27 49’ 76 第三趟后 13 27 38 49 49’ 65 76 97 每个记录视为一个有序子文件,两个子文件进行归并,得4个有序子文件。 ⒉ 归并排序过程 void merge(listtype r,r2; int l,m,n;); { //t[s..m]和r[m+1..n] 为两个有序子文件, 归并结果存放在r2[s..n]中 i=s; j=m+1; k=s-1; WHILE (i≤m) AND (j≤n) DO { k=k+1; //k为下一次存入r2的位置 if r[i].key≤r[j].key { r2[k]=r[i]; i=i+1;} else { r2[k]=r[j]; i=j+1;}} if (i≤m) r2[k+1..n]=r[i..m]; if (j≤n) r2[k+1..n]=r[j..n] ; {将其中一个文件的余下部分复制到r2的尾部} }//merge 归并排序是稳定的,时间复杂度为O(nlogn), 需要和待排序记录相等数量的辅助空间r2。 9.6 基数排序 基数排序法是一种用多关键字排序思想对单逻辑关键字进行排序,而无需进行关键字比较的新排序方法,其基本操作是“分配”和“收集”。 ⒈ 基数排序方法:基数排序是按组成关键字的各位的值进行分配和收集,与前面介绍的排序方法不同,它无需进行关键字之间的比较。 设关键字有d 位,每位的取值范围为 r (称为基数),则需要进行d 趟分配与收集,需要设立 r 个队列。例如,若每位是十进制数字,则需要设立10个队列,若每位由小写字母组成,则要设立26个队列 。 9.6 基数排序 2. 基数排序的步骤 ⑴ 从关键字的低位开始进行第i趟(i=1,2,...d)分配即将单链表中的记录依次按关键字的第i位分配到相应编号的队列中; ⑵ 分配完毕后,将各队列的记录按队列编号顺序收集成一个单链表; ⑶ 重复⑴⑵,直到第d趟收集完毕,所得单链表已成为有序表。 9.6 基数排序 例:初始 278—109—063—930—589—184—505—269—008—083 0 1 2 3 4 5 6 7 8 9 第一趟分配 269 083 008 589 930 063 184 505 278 109 第一趟收集 930—063—083—184—505—278—008—109—589—269 第二趟分配 109

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档