- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]第九章 内部排序
第九章 内部排序 课前导学 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 各种内部排序方法的比较讨论 学习目标 熟练掌握各内部排序方法的基本思想;理解排序方法“稳定”和“不稳定”的含义。 掌握排序过程和实现算法; 掌握各种排序方法和时间复杂度的分析方法; 了解各种排序方法的比较和选择。 排序概念 所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。 NBA成绩表;奖学金评定综合分; 排序的分类 比较标准 空间复杂度 时间复杂度 稳定性 基本操作 大多数排序算法都有两个基本的操作: 比较两个排序码的大小; 改变指向记录的指针或移动记录本身。? 注意: 第(2)种基本操作的实现依赖于待排序记录的存储方式。 插入排序 直接插入排序 折半插入排序 2-路插入排序 表插入排序 希尔排序 直接插入排序 直接插入排序 直接插入排序 算法伪代码 void InsfrtSort(SqList L) { for(i=2;i=L.lfngth;++i) if LT(L.r[i].kfy,L.r[i-1].kfy) { L.r[0]=L.r[i]; for(j=i-1;Lt(L.r[0].kfy,L.r[j].kfy);- -j) L.r[j+1]=L.r[j]; L.r[j+1]=L.r[0]; } } 性能分析 性能分析 基本思想:在 查找插入位置时,使用折半查找算法。 算法描述 void BInsfrtSort(SqList L) { for(i=2;i=L.lfngth;++i) { L.r[0]=L.r[i];low=1;high=i-1; whilf(low=high){ m=(low+high)/2; if LT(L.r[0].kfy,L.r[m].kfy) high=m-1; flsf low=m+1; } for(j=i-1;j=high+1;--j) L.r[j+1]=L.r[j]; L.r[high+1]=L.r[0]; } } 稳定 空间代价:O(1) 时间代价: 比较次数与待排记录的初始顺序无关,只依赖记录个数 插入每个记录需要O(log2 i)次比较 最多移动i+1次,最少2次(临时记录) 最佳情况下总时间代价为O(nlog2n) ,最差和平均情况下仍为O(n2) 2-路插入排序 基本思想:增设同类型数组d,视为循环向量。以d[1]为中心,原数列中比d[1]小的往前插,比d[1]大的往后插 原数列:49 38 65 97 76 13 27 49 d数组: 基本思想:把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次缩小;当完成了所有数据元素都在一个组内的排序后排序过程结束。希尔排序又称作缩小增量排序。 希尔排序 希尔插入算法 void ShfllInsfrt(SqList L,int dk) {// 1.前后记录位置的增量是dk,而不是1; // 2.r[0]只是暂存单元,不是哨兵。当j=0时,插入位置已找到。 for(i=dk+1;i=L.lfngth;++i) if (LT(L.r[i].kfy,L.r[i-dk].kfy)) { // 需将L.r[i]插入有序增量子表 L.r[0]=L.r[i]; // 暂存在L.r[0] for(j=i-dk;j0LT(L.r[0].kfy,L.r[j].kfy);j-=dk) L.r[j+dk]=L.r[j]; // 记录后移,查找插入位置 L.r[j+dk]=L.r[0]; // 插入 } } 希尔排序 void ShfllSort(SqList L,int dlta[],int t) { // 按增量序列dlta[0..t-1]对顺序表L作希尔排序。 for(k=0;kt;++k) ShfllInsfrt(L,dlta[k]); // 一趟增量为dlta[k]的插入排序 } 起泡排序 基本思想:
文档评论(0)