- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第9章 排序 排序(Sorting):将一个数据元素(或记录)的任意序列重新排列成一个按关键字有序的序列。 假设含有n个记录的序列为{R1,R2,…,Rn},其相应的关键字序列为{K1,K2,…,Kn},需确定1,2,…,n的一种排列p1,p2,…pn,使其相应的关键字满足如下的非递减(或非递增)关系Kp1≤Kp2 ≤ … ≤ Kpn,即使序列{R1,R2,…,Rn}成为一个按关键字有序的序列{Rp1,Rp2,…,Rpn},这样一种操作称为排序。 按内部排序过程中所需的工作量,内部排序分为三大类: 简单的排序方法,其时间复杂度为O(n2); 先进的排序方法,其时间复杂度为O(nlogn); 基数排序,其时间复杂度为O(dn)。 一、插入排序 插入排序的基本思想:逐个将纪录插入到已排好次序的有序表中得到一个新的有序表。 直接插入排序(Straight Insertion Sort) 希尔排序(Shell’s Sort) 最坏的情况:逆序 比较次数:∑i=(n+2)(n-1)/2 (i= 2,……n) 移动次数: ∑(i+1)=(n+4)(n-1)/2 (i= 2,……n) 平均:T(n)=O(n2) 故:元素个数n越小越好,待排序序列初始时排序度越高越好。 具体做法: 设置一个增量序列:d1,d2,…,dt(d1d2…dt=1),每个增量互质。 对每个增量dk(k=1,2,……,t),把整个表分成dk个子表(即相差dk个位置的记录在同一个子表中),对每个子表分别进行直接插入排序。 二、交换排序 藉助“交换”进行排序的方法。 起泡排序(Bubble Sort) 快速排序(Quick Sort) 具体做法:若序列中有 n 个元素,任选一个记录的关键字作为枢轴(或支点)(pivot),将序列分成两部分。其中左半部分的结点的关键字小于等于界点,右半部分的结点的关键字大于等于界点。然后,对左右两部分分别进行类似的处理,直至排好序为止。 三、选择排序 选择排序(Selection Sort)的基本思想:每一趟在n-i+1(i=1,2,……,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。 简单选择排序(Simple Selection Sort) 堆排序(Heap Sort) 四、归并排序 归并排序(Merging Sort):将两个或两个以上的有序表合并成一个新的有序表。 五、基数排序 基数排序(Radix Sorting):借助多关键字排序的思想 链式基数排序:基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法。 第9章 小结 各种内部排序方法的比较讨论: 作业题 已知序列{503,87,512,61,908,170,897,275,653,462,378},要求写出: 采用希尔排序法(增量序列为5、3、1)作非递减排序时的每一趟结果; 采用快速排序法作非递减排序时的前三趟结果; 采用堆排序法作非递减排序时的前三趟结果; 采用2-路归并法作非递减排序时的每一趟结果; 采用基数排序法作非递减排序时的每一趟结果。 算法性能分析: 需要和待排序记录等数量的辅助存储空间。 时间复杂度为O(nlog2n)。 归并排序是稳定的排序。 例如:基数排序实例 假定给定的是t=3位十进制数,现要求通过基数排序法将其排序。 方法: 因十进制数分别有数字:0,1,2,…… 9 ,所以设置 十个队列,分别用B0、B1、B2、 …… B9进行标识,每个队列设置队首指针f[i]和队尾指针e[i](i=0,1,2,……,9)。 执行j=1…t (这里t =3)次循环,每次进行一次分配动作,一次收集动作。 分配:将右起第j位数字相同的数放入同一队列。比如数字为1者,则放入队列B1,依此类推 …… 收集:按B0、B1、B2、…… B9的顺序进行收集。 算法分析: 空间:采用顺序存储分配,显然不合适。由于每个队列都有可能存放所有的待排序的整数,所以额外空间的需求为 10n,太大了。采用链式存储分配是合理的,额外空间的需求为 n,通常再增加指向每个队列的首尾指针就可以了。在一般情况下,设每个关键字的取值范围为 rd, 首尾指针共计 2×rd 个 ,总的空间为 O( n+2×rd) 。 时间: 在一般情况下,设每个结点有 d 位关键字,必须执行t = d次分配和收集操作: 分配的时间:O(n) 收集的时间:O(rd) 总的时间复杂度为:O( d ×(n + rd)) O(rd) O(d(n+rd)) O(d(n+rd)) 基数排序 O(n) O(nlogn) O(nlogn) 归并排序 O(1) O(nlogn) O(nlogn) 堆排序 O(logn) O(n2) O(nlogn) 快速排序 O(
您可能关注的文档
最近下载
- BSL-2 实验室生物安全手册.docx VIP
- 部编人教版《道德与法治》一年级上册第三、四单元教材分析.ppt VIP
- 电动机控制实践教学教案.pdf VIP
- RS Components 电工电料 电流互感器 CMS2050-SP7 使用说明.pdf VIP
- 液压油缸的初步知识与装配.ppt VIP
- 弯曲零件展开料长的计算.docx VIP
- 大一新生班干部竞选演讲稿【课件】.pptx
- DL_T 5754-2017 高清版 智能变电站工程调试质量检验评定规程.docx VIP
- 2025年低压电工证(复审)考试笔试试题(600题)附答案.pdf VIP
- 2024年广东省高职高考语文试卷及答案 .pdf VIP
文档评论(0)