第十章排序.ppt

上传人:本田雅阁 文档编号:2537483 上传时间:2019-04-05 格式:PPT 页数:68 大小:921.01KB
返回 下载 相关 举报
第十章排序.ppt_第1页
第1页 / 共68页
第十章排序.ppt_第2页
第2页 / 共68页
第十章排序.ppt_第3页
第3页 / 共68页
亲,该文档总共68页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第十章排序.ppt》由会员分享,可在线阅读,更多相关《第十章排序.ppt(68页珍藏版)》请在三一文库上搜索。

1、新办公地点:新办公楼(计算中心)805,第十章 内部排序,10.1 排序,设 n 个记录的序列为 R1 , R2 , R3 , . . . , Rn ,其相应的关键字序列为 K1 , K2 , K3 , . . . , Kn ,此操作过程称为排序。,排序分类 按待排序记录所在位置 内部排序:待排序记录存放在内存 外部排序:排序过程中需对外存进行访问的排序 按排序依据原则 插入排序:直接插入排序、折半插入排序、希尔排序 交换排序:冒泡排序、快速排序 选择排序:简单选择排序、堆排序 归并排序:2-路归并排序 基数排序 按排序后关键字相等的记录的相对位置 稳定排序 不稳定排序,按排序所需工作量 简单

2、的排序方法:T(n)=O(n) 先进的排序方法:T(n)=O(logn) 基数排序:T(n)=O(d.n) 排序基本操作 比较两个关键字大小 将记录从一个位置移动到另一个位置,稳定排序 与 不稳定排序,假设 Ki = Kj ,且排序前序列中 Ri 领先于 Rj ;,若在排序后的序列中 Ri 仍领先于 Rj ,则称排序方法是稳定的。,若在排序后的序列中 Rj 仍领先于 Ri ,则称排序方法是不稳定的。,例,序列 3 15 8 8 6 9,若排序后得 3 6 8 8 9 15,稳定的,若排序后得 3 6 8 8 9 15,不稳定的,内部排序 与 外部排序,内部排序: 指的是待排序记录存放在计算机随

3、机存储器中进行的排序过程。,外部排序: 指的是待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。,内部排序,按照排序过程中所依据的原则的不同可以分类为:,插入排序,交换排序(快速排序),选择排序,归并排序,基数排序,二叉排序树排序,10.2 插入排序,插入排序是将当前无序区中最前端的记录插入到有序区中,逐渐扩大有序区,直到所有记录都插入到有序区中为止。 直接插入排序 1)过程:在有序区中进行顺序查找以确定插入的位置,然后移动记录腾出空间,以便相应关键字的记录插入。 在有序区的前端r0中设一个监视哨,存放当前要插入的关键字。,例,序列 49 38 65

4、 97 76 13 27,初始,S = 49 ;, 38 49 ,算法描述:,初始,令第 1 个元素作为初始有序表;,依次插入第 2 , 3 , , k 个元素构造新的有序表;,直至最后一个元素;,直接插入排序算法主要应用比较和移动两种操作。,算法: InsertSort(r,n) for (i=2;i=n;i+) r0=ri; j=i-1; while (r0rj) rj+1=rj; j-; rj+1=r0; ,举例:有序列:20,6,15,7,3,过称为:,r0 r1 r2 r3 r4 r5,6 20 6 15 7 3,15 6 20 15 7 3,7 6 15 20 7 3,3 6 7

5、15 20 3, 3 6 7 15 20 ,算法评价 时间复杂度 若待排序记录按关键字从小到大排列(正序) 关键字比较次数:,记录移动次数:,若待排序记录按关键字从大到小排列(逆序) 关键字比较次数:,记录移动次数:,若待排序记录是随机的,取平均值 关键字比较次数约为:,记录移动次数约为:,T(n)=O(n),空间复杂度:S(n)=O(1),如何改进直接插入排序算法,1. 从比较次数改进: 折半插入排序,由于直接插入排序算法利用了有序表的插入操作,故顺序查找操作可以替换为折半查找操作。,例,序列 49 38 65 97 76 13 27,设已形成有序表 38 49 65 97 76 ,插入元素

6、 13,算法 BinSort(r,n) for (i=2;i=low;j-) rj+1=rj; rlow=r0; ,从移动次数上改进: 2-路插入排序,主要目的是减少排序过程中移动记录的次数。,思想:,以第一个元素为基准,将元素分为两个序列;,比第一个元素小的元素构造前序列;,比第一个元素大的元素构造后序列;,例,序列 49 38 65 97 76 13 27,以 49 为基准,算法描述,初始,取第一个元素为基准元素;,构造前序列 S1,后序列 S2 ;,与基准元素比较:,若小,插入到前序列 S1 中;,若大,插入到后序列 S2 中;,S1 + 基准元素 + S2 可得最终有序表。,例,序列

7、49 38 65 97 76 13 27,以 49 为基准, 38 , 65 , 13 27 38 + 49 + 65 76 97 ,10.2.2 希尔(shell)排序,分析直接插入排序,1. 若待排序记录序列按关键字基本有序,则排序效率可大大提高;,2. 待排序记录总数越少,排序效率越高;,希尔排序(缩小增量法) 排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止,思想:,先将待排序记录序列分割成为若干子序列分别进行直接插入排序;,待整个序列中的记录基本有序后,再全体进行一次

8、直接插入排序。,例,序列 49 38 65 97 76 13 27 48 55 4 19,第一趟排序 取d1=5,13 19 49,27 38,48 65,55 97,4 76,第二趟排序 取d1=3,13 38 55 76,4 27 49 65,19 48 97,第三趟排序 取d1=1,4 13 19 27 38 48 49 55 65 76 97,希尔排序特点 子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列 希尔排序可提高排序速度,因为 分组后n值减小,n更小,而T(n)=O(n),所以T(n)从总体上看是减小了 关键字较小的记录跳跃式前移,在进行最后一趟增量为

9、1的插入排序时,序列已基本有序 增量序列取法 无除1以外的公因子 最后一个增量值必须为1,10.3 交换排序,10.3.1 冒泡排序,思想: 通过不断比较相邻元素大小,进行交换来实现排序。 第一趟排序: 首先将第一个元素与第二个元素比较大小,若为逆序,则交换; 然后比较第二个元素与第三个元素的大小,若为逆序,则交换;,. . .,直至比较第 n-1 个元素与第 n 个元素的大小,若为逆序,则交换; 结果:关键字最大的记录被交换至最后一个元素位置上。,对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置 重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作

10、”为止,例,序列 49 38 76 13 27,38 49 13 27,初始,第一趟排序后,最大值,次大值,第二趟排序后,38 13 27,13 27,第三趟排序后,第四趟排序后,算法: BubbSort(r,n) f=n; while (f0) k=f-1; f=0; for (j=1;jrj+1) t=rj; rj=rj+1; rj+1=t; f-; ,算法也可写成: BubbSort(r,n) for (i=0;irj) t=ri; ri=rj; rj=t; ,算法评价 时间复杂度 最好情况(正序) 比较次数:n-1 移动次数:0 最坏情况(逆序) 比较次数:,移动次数:,空间复杂度:S

11、(n)=O(1),T(n)=O(n), 10.3.2 快速排序 1)基本思想:快速排序是对冒泡排序的一种改进。通过一趟排序将一个无序区分割成两个独立的无序子区,其中前一部分子区中所有元素关键字均不大于后一部分子区中元素关键字,然后对每一子区再进行分割,直到整个序列有序为止。 2)分割过程: 选取表中一个元素rk(一般选取第一个元素),令x=rk,称为控制关键字, 用控制关键字和无序区中其余元素关键字进行比较。 设置两个指示器i,j,分别表示线性表第一个和最后一个元素位置。, 将j逐渐减小,逐次比较rj与x,直到出现一个rjx,然后将ri移到rj 位置。如此反复进行,直到i=j为止,最后将x移到

12、rj位置,完成一趟排序。此时以x为界分割成两个子区。,举例:设序列为46,55,13,42,94,5,17,70,算法: QkSort(r,low,hig) x=rlow; i=low; j=hig; while (i=x) j-; t=ri; ri=rj; rj=t; while (ij ,算法评价 时间复杂度 最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n) 最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n),空间复杂度:需栈空间以实现递归 最坏情况:S(n)=O(n) 一般情况:S(n)=O(log2n),T(n)=O(n),10.4 选择排序,思想: 每一趟

13、都选出一个最大或最小的元素,并放在合适的位置。,简单选择排序,树形选择排序,堆排序,10.4.1 简单选择排序,思想:,第 1 趟选择:,从 1n 个记录中选择关键字最小的记录,并和第 1 个记录交换。,第 2 趟选择:,从 2n 个记录中选择关键字最小的记录,并和第 2 个记录交换。,第n-1趟选择:,从 n-1n 个记录中选择关键字最小的记录,并和第 n-1 个记录交换。,. . .,举例:设有序列: 5,4,12,20,27,3,1 ,排序过称为:,结果: 1,3,4,5,12,20,27 ,算法 SelSort(r,n) for (i=0;in-1;i+) j=i; for (k=i+

14、1;kn;k+) if (rjrk) j=k; if (j!=i) t=ri; ri=rk; rk=t; ,算法分析:算法由两层循环构成,外层循环表示共需进行n-1趟排序,内层循环表示每进行一趟排序需要进行的记录关键字间的比较。 比较次数:n(n-1)/2 移动次数:最坏情况下为3(n-1) 所以总的时间复杂度为:O(n2) 空间复杂度为:O(1) 交换记录用,选择排序的主要操作是进行关键字间的比较。,在 n 个关键字中选出最小值,至少需要 n-1 次比较。,在剩余的 n-1 个关键字中选出最小值,至少需要 n-2 次比较?,如果能利用前 n-1 次比较所得信息,可以减少后面选择的比较次数。,

15、体育比赛中的锦标赛:,例,8 名运动员要决出 冠、亚、季军。,按简单选择排序需要比赛 7+6+5 = 18 场。,若能够利用以前的比赛结果,比赛场次实际可以减少为 11 场。,前提: 若 甲 胜 乙 ,乙 胜 丙 ,则 甲 必能胜 丙 。,冠军,如何求 亚军?,亚军,可以利用前面的比赛结果!,如何求 季军?,季军,同样可以利用前面的比赛结果!,10.4.2 树形选择排序,又称锦标赛排序,是一种按照锦标赛的思想进行选择排序的方法。,例,序列 49 38 65 97 76 13 27 50,第一趟选择,最小值,第二趟选择,次小值,第三趟选择,次次小值,缺点: 需要大量辅助存储空间,堆排序 堆的定义

16、:n个元素的序列(k1,k2,kn),当且仅当满足下列关系时,称之为堆,例 (96,83,27,38,11,9),例 (13,38,27,50,76,65,49,97),可将堆序列看成完全二叉树,则堆顶元素(完全二叉树的根)必为序列中n个元素的最小值或最大值,堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫 堆排序需解决的两个问题: 如何由一个无序序列建成一个堆? 如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆? 第二个问题解决方法筛选 方法:输

17、出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”,例,算法为: Typedef SqList HeapType;/堆采用顺序结构存储,数组r Void HeapAdjust(HeapType r,int s,int m) t=rs; for(j=2*s;jrj+1) j+; if (trj) rs=rj; s=j; else break; ri=t; R17=97,38,27,50,76,65,49 S=1,m=7,第一个问题解决方法 方法:从无序序列的

18、第n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选,97,27,38,49,65,76,50,例 含8个元素的无序序列(49,38,65,97,76,13,27,50),算法为: HeapSort(HeapType r,n) for (i=n/2;i=1;i-) HeapAdjust(r,n,i); /初始建堆 for (i=n;i=2;i-) r1=ri; HeapAdjust(r,i-1,1); ,算法评价 时间复杂度:最坏情况下T(n)=O(nlogn) 空间复杂度:S(n)=O(1),10.5 归并排序,归并: 将两个或两个以上的有序表合

19、并成一个新的有序表。,有序线性表、有序链表的归并;,利用归并的思想实现排序 :,初始,n 个记录看作是 n 个有序的子序列,长度为 1 ;,再两两归并 ;,重复执行直至得到一个长度为 n 的有序序列为止 。,这种排序方法称为 2路归并排序。,例,序列 49 , 38 , 65 , 97 , 76 , 13 , 27 ,初始 49 38 65 97 76 13 27,一趟归并,38 49,65 97,13 76,27,二趟归并,38 49 65 97,13 27 76,三趟归并,13 27 38 49 65 76 97,void mergesort(JD r,int n) int i,s=1;

20、JD tM; while(sn) tgb(s,n,r,t); s*=2; if(sn) tgb(s,n,t,r); s*=2; else i=1; while(i=n) ri=ti+; ,void tgb(int s,int n,JD r,JD t) int i=1; while(i=(n-2*s+1) merge(r,i,i+s-1,i+2*s-1,t); i=i+2*s; if(i(n-s+1) merge(r,i,i+s-1,n,t); else while(i=n) ti=ri+; ,void merge(JD r,int h,int m,int w,JD t) int i,j,k;

21、i=h; j=m+1; k=h-1; while(im) while(j=w) t+k=rj+; else while(i=m) t+k=ri+; ,算法评价 时间复杂度:T(n)=O(nlog2n) 空间复杂度:S(n)=O(n),10.6 基数排序,是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法。,10.6.1 多关键字排序,扑克牌问题 :,已知扑克牌中52张牌面的次序关系定义为:,例, 8 3,花色优先级更高,为主关键字,面值为次关键字,52张牌排序方法 :,最高位优先法(MSDF) :,先按不同“花色”分成有次序的4堆,每一堆均具有相同的花色;,然后分别对每一堆按“面值”大小

22、整理有序。,最低位优先法(LSDF) :,先按不同“面值”分成 13 堆 ;,然后将这 13 堆牌自小至大叠在一起( 2 , 3 , . . . , A ) ;,然后将这付牌整个颠倒过来再重新按不同的“花色”分成 4 堆 ;,最后将这 4 堆牌按自小至大的次序合在一起 。,收集,分配,10.6.2 基数排序,基数排序就是借助于“分配”和“收集”两种操作实现对单逻辑关键字的排序。,首先,单逻辑关键字通常都可以看作是由若干关键字复合而成。,其次,利用 LSDF 法实现对若干关键字的排序。,例,若关键字是数值,且值域为 0K999 ,,故可以将 K 看作是由 3 个关键字 K0 K1 K2 组成,,

23、例,603是由 6 0 3 组成。,例,序列 278 109 063 930 589 184 505 269 008 083,第一趟分配,0 1 2 3 4 5 6 7 8 9,第一趟收集,930,063 083,184,505,278 008,109 589 269,第二趟分配,0 1 2 3 4 5 6 7 8 9,第二趟收集,505 008 109,930,063 269,278,083 184 589,第三趟分配,0 1 2 3 4 5 6 7 8 9,第三趟收集,008 063 083,109 184,269 278,505 589,930,算法: #define D 3 typed

24、ef struct node int key; float info; int link; JD; int radixsort(JD r,int n) int i,j,k,t,p,rd,rg,f10,e10; for(i=1;in;i+) ri.link=i+1; rn.link=0; p=1; rd=1; rg=10; for(i=1;i=D;i+) for(j=0;j10;j+) fj=0; ej=0; ,do k=(rp.key%rg)/rd; if(fk=0) fk=p; else rek.link=p; ek=p; p=rp.link; while(p0); j=0; while(f

25、j=0) j+; p=fj; t=ej;,for(k=j+1;k0) rt.link=fk; t=ek; rt.link=0; rg*=10; rd*=10; return(p); ,算法评价 时间复杂度: 分配:T(n)=O(n) 收集:T(n)=O(rd) T(n)=O(d(n+rd) 其中:n记录数 d关键字数 rd关键字取值范围 空间复杂度:S(n)=2rd个队列指针+n个指针域空间,结论 1)若待排序的记录数n较小(n50),则可采用插入排序或简单选择排序。且由于插入排序的移动次数较选择排序多,因此若记录本身较大时宜采用选择排序。 2)若n较大,则应采用时间复杂度O(nlog2n)的

26、排序方法,如快速排序或堆排序。当排序的关键字是随机分布时,快速排序的平均运行时间最短;堆排序只需1个辅助空间,且不会出现快速排序可能出现的最坏情况,但堆排序的建堆时间较长。 3)若待排序记录按关键字基本有序,则宜采用插入排序或冒泡排序。 4)从方法的稳定性看,所有时间复杂度为O(n2)的简单排序方法是稳定的,而快速排序、堆排序等性能较好的排序方法是不稳定的。 5)在一般情况下,待排序记录采用顺序存储结构,而当记录本身较大时,为避免耗费大量时间移动记录,可用链表作存储结构。 6)当待排序记录经常进行插入、删除时,为避免大量移动记录,宜采用动态存储结构。,作业: 序列 8 , 3 , 10 , 13 , 25 , 18 , 6 , 4,对上述序列使用各种算法进行排序。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1