- 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.1.1 直接插入排序 9.1.2 折半插入排序 9.1.3 希尔排序 9.2 交换排序 9.2.1 冒泡排序 9.2.2 快速排序 排序:假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn}。将这些记录重新排序为{Ri1,Ri2,…,Rin},使得相应的关键字值满足条件Ki1 ≤ Ki2 ≤ … ≤ Kin,这样的一种操作称为排序。 存在Ki = Kj (1 ≤ i ≤ n, 1 ≤ j ≤ n, i ≠ j),在排序前Ri领先于Rj(即i j),若在排序后Ri仍领先于Rj,则称所用的排序方法是稳定的;反之,若在排序后的Rj领先于Ri,则称所用的排序方法是不稳定的。 排序分为两类:外排序和内排序。 外排序指排序过程中还需访问外存储器的排序过程。当记录数量很大,以致内存不能容纳全部记录时,只能使用外排序。 内排序指待排序记录完全存放在内存中所进行的排序过程适合数据量不大的情况。 待排序记录的数据类型说明如下: #define MAXSIZE 100 #define KEYTYPE int typedef struct { KEYTYPE key; … … /* 记录的其余数据部分,在下面的讨论和算法中忽略不考虑 */ }RECNODE; RECNODE r[MAXSIZE]; 9.1 插入排序 9.1.1 直接插入排序 直接插入排序方法:开始时,把第一个记录看成是已经排好序的有序表,这时有序表中只有一个记录;然后,从第2个记录起到第n个记录,逐个向有序表中进行插入操作。 已知一组记录的关键字值:33、18、21、13、25、14、21、12 直接插入排序的算法如下: Void insertsort (RECNODE *r, int n) { int i, j; for(i = 2; i = n; i++) { r[0]= r[i]; j = i - 1; while(r[0].key r[j].key) { r[j + 1] = r[j]; j--; } r[j + 1] = r[0]; } } 算法效率分析: 空间效率:仅用了一个辅助单元r[0]。 时间效率: 最好情况下:待排序列已按关键字有序 总比较次数= n-1次 总移动次数= 0次 最坏情况下:倒序排列时 二分判定有序表插入位置方法: ① r[0]=r[i] ; low=1;high=i-1 ; ② 若lowhigh,得到插入位置,转⑤ ③ 若low≤high,mid=(low+high)/2; ④ 若r[0].keyr[mid].key,则high=mid -1; 否则,low=mid+1;转② ⑤ high+1即为待插入位置,将i-1到high+1的记录,逐个后移; 最后放置待插入记录 r[high+1]=r[0]。 具体算法如下: void shellinsert(RECNODE *r, int n, int dk) { for(i=dk+1;i=n;i++) if(r[i].key r[i-dk].key) {r[0]=r[i]; for(j=i-dk;j0r[0].key r[j].key;j=j-dk) r[j+dk]=r[j]; r[j+dk]=r[0]; } } void ShellSort(RECNODE *r, int n, int p[], int t) { int k; for(k=0;kt;t++) ShellSort(r,n,p[k]); } 希尔排序时效分析: 关键字的比较次数与记录移动次数依赖于步长因子序列的选取 步长因子序列可以有各种取法: 取奇数的,也有取质数的 注意:步长因子中除1外没有公因子,且最后一个步长因子必须为1 希尔排序方法是一个不稳定的排序方法。 分析:空间上,仅用了一个辅助单元。时间上,总共要进行n-1趟冒泡,对i个记录的表进行一趟冒泡需要i-1次关键字比较。最好情况下,待排序列已有序,不需交换;最坏情况下,每次比较后均要进行交换。 冒泡排序是稳定排序。 9.2.2 快速排序 它的基本思路是:第一趟处理整个待排序列,选取其中的一个记录(通常可选第一个记录)作为枢轴(支点)记录,通过一趟快速排序将待排序列分割成独立的两个部分,前一部分记录的关
文档评论(0)