第十章 排序62833.ppt
《第十章 排序62833.ppt》由会员分享,可在线阅读,更多相关《第十章 排序62833.ppt(70页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第10章章 内部排序内部排序10.1 概述概述10.2 插入排序插入排序10.3 快速排序快速排序10.4 选择排序选择排序10.5 归并排序归并排序10.6 基数排序基数排序10.7 各种内部排序方法的比较讨论各种内部排序方法的比较讨论110.1 概述概述排序排序 是将是将数据元素的一个任意序列,重新排列成一数据元素的一个任意序列,重新排列成一个按关键字有序的序列。个按关键字有序的序列。排序的一个确切定义:排序的一个确切定义:假设含假设含n个记录的序列为个记录的序列为 R1,R2,R3,Rn其相应的关键字序列为其相应的关键字序列为K1,K2,K3,Kn需确定需确定1,2,n的一种排列的一种
2、排列P1,P2,P3,Pn,使其使其相应的关相应的关键字满足如下的递增键字满足如下的递增(或递减或递减)关系关系:Kp1Kp2Kpn即使序列即使序列R1,R2,R3,Rn成为一个按关键字有序的序列成为一个按关键字有序的序列:Rp1,Rp2,Rp3,Rpn这种操作称为这种操作称为排序排序.2稳定排序方法稳定排序方法假设假设Ki=Kj(1=i,j=n,ij),且在排序前的且在排序前的序列中序列中Ri领先于领先于Rj,若在排序后的序列中若在排序后的序列中Ri仍领先仍领先Rj,则称所用的排序方法是则称所用的排序方法是稳定的稳定的。不稳定排序方法不稳定排序方法假设假设Ki=Kj(1=i,j=n,ij),
3、且在排序前的且在排序前的序列中序列中Ri领先于领先于Rj,若在排序后的序列中若在排序后的序列中Rj领领先先Ri,则称所用的排序方法是则称所用的排序方法是不稳定的不稳定的。例:例:姓名姓名年龄年龄体重体重1李由李由57622王天王天54763七明七明24754张强张强24725陈华陈华2453按某种按某种稳定稳定方法对年龄方法对年龄关键字进行关键字进行排序排序姓名姓名年龄年龄体重体重3七明七明24754张强张强24725陈华陈华24532王天王天54761李由李由57623姓名姓名年龄年龄体重体重1李由李由57622王天王天54763七明七明24754张强张强24725陈华陈华2453按某种按某
4、种不稳不稳定定方法对年方法对年龄关键字进龄关键字进行排序行排序姓名姓名年龄年龄体重体重4张强张强24723七明七明24755陈华陈华24532王天王天54761李由李由5762待排序记录存放在计算机随机存储器中进待排序记录存放在计算机随机存储器中进行的排序过程;行的排序过程;内部排序内部排序待排序记录的数量很大,以致内存一次不待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中尚需对外能容纳全部记录,在排序过程中尚需对外存进行访问的排序过程。存进行访问的排序过程。外部排序外部排序4按按排序过程中依据的不同原则对内排方法分类:排序过程中依据的不同原则对内排方法分类:(1)插入排序)插
5、入排序(2)交换排序)交换排序(3)选择排序)选择排序(4)归并排序)归并排序(5)基数排序)基数排序按内排按内排过程中所需的工作量分类:过程中所需的工作量分类:(1)简单的排序方法,其时间复杂度为)简单的排序方法,其时间复杂度为O(nn)(2)先进的排序方法,其时间复杂度为先进的排序方法,其时间复杂度为O(nlogn);(3)基数排序,其时间复杂度为基数排序,其时间复杂度为O(dn)排序算法的两种基本操作:排序算法的两种基本操作:(1)比较比较两个关键字的大小;两个关键字的大小;(2)将记录从一个位置)将记录从一个位置移移至另一个位置;至另一个位置;5待待排序的记录序列可有三种存储方式:排序
6、的记录序列可有三种存储方式:(1)待排序的记录存放在地址连续的一组存储单元上。)待排序的记录存放在地址连续的一组存储单元上。(2)待排序的记录存放在静态链表中。)待排序的记录存放在静态链表中。(3)待排序的记录本身存储在一组地址连续的存储单元)待排序的记录本身存储在一组地址连续的存储单元 内内,同时另设一个指示各个记录存储位置的地址向量。同时另设一个指示各个记录存储位置的地址向量。待待排序记录的数据类型设为:排序记录的数据类型设为:P2646#define MAXSIZE 20 /示例小顺序表的最大长度typedef int KeyType;/定义关键字类型为整数类型typedef struc
7、t KeyType key;/关键字项 InfoType otherinfo;/其他数据项 RedType;/记录类型typedef struct RedType rMAXSIZE+1;/r0闲置或作哨兵单元 int length;/顺序表的当前长度 SqList;/顺序表类型710.2 插入排序插入排序插入排序插入排序直接插入排序直接插入排序折半插入排序折半插入排序2-路插入排序路插入排序表插入排序表插入排序希尔排序希尔排序10.2.1 直接插入排序直接插入排序基本操作:基本操作:将一个记录插入到已排好序的有序表中,从将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增而得到一个新
8、的、记录数增1的有序表。的有序表。例例:有一组待排序的记录的关键字初始序列如下有一组待排序的记录的关键字初始序列如下:(49,38,65,97,76,13,27,49)用用L(SqList L)的的L.r1.key.L.r8.key依次存储依次存储L.r1.key.L.r8.key是递增有序的是递增有序的直接插直接插入排序入排序8直接插入排序的过程直接插入排序的过程:初始关键字初始关键字r0 r1 r2 r3 r4 r5 r6 r7 r8 49 38 65 97 76 13 27 49第一趟插入第一趟插入384965 97 76 13 27 49第二趟插入第二趟插入38496597 76 13
9、 27 49第三趟插入第三趟插入38 49 65 97 76 13 27 49第四趟插入第四趟插入38 49 65 76 9713 27 49第五趟插入第五趟插入13 38 49 65 76 9727 49第六趟插入第六趟插入13 27 38 49 65 76 9749第七趟插入第七趟插入13 27 38 49 49 65 76 97i=2i=3i=4i=5i=6i=7i=89直接插入排序算法分析直接插入排序算法分析:有有n个记录待排序个记录待排序,需进行需进行2.n共共n-1趟插入趟插入;一级算一级算法:法:void InsertSort(SqList&L)for (i=2;i=L.leng
10、th;+i)第第i趟插入;趟插入;第第i趟插入完成的功能趟插入完成的功能:在含有在含有i-1个记录的有序序列个记录的有序序列r1.i-1 中插入一个记录中插入一个记录ri,插入后变成含插入后变成含 有有i个记录的有序序列个记录的有序序列r1.i。10第第i趟插入的算法趟插入的算法二级算二级算法:法:例:第例:第i=7趟插入:趟插入:if (LT(L.ri.key,L.ri-1.key)L.ri插入到插入到 L.r1.L.ri-1中中 L.r0=L.ri;复制为哨兵复制为哨兵L.ri=L.ri-1;for (j=i-2;LT(L.r0.key,L.rj.key);-j)L.rj+1=L.rj;L
11、.rj+1=L.r0;13 38 49 65 76 97 27 491 2 3 4 5 6 7 811三级算三级算法:法:void InsertSort(SqList&L)for (i=2;i=L.length;+i)if (LT(L.ri.key,L.ri-1.key)L.r0=L.ri;L.ri=L.ri-1;for (j=i-2;LT(L.r0.key,L.rj.key);-j)L.rj+1=L.rj;L.rj+1=L.r0;12直接插入排序的性能分析直接插入排序的性能分析:(1)空间空间:只需一个记录的辅助空间只需一个记录的辅助空间r0.(2)时间时间:基本运算基本运算:比较和移动记录
12、比较和移动记录;比较和移动记录的次数与关键字的初始序列有关比较和移动记录的次数与关键字的初始序列有关:(1)待排序序列关键字正序排序待排序序列关键字正序排序:关键字比较次数关键字比较次数:n-1 移动记录的次数移动记录的次数:0(2)待排序序列关键字逆序排序待排序序列关键字逆序排序:关键字比较次数关键字比较次数:2+3+n=(n+2)(n-1)/2 移动记录的次数移动记录的次数:3+4+5+(n+1)=(n+4)(n-1)/2(3)待排序序列关键字随机排序待排序序列关键字随机排序:关键字比较次数关键字比较次数:(n-1)(n+4)/4 移动记录的次数移动记录的次数:(n+4)(n-1)/4直接
13、插入排序算直接插入排序算法的时间复杂度法的时间复杂度为为O(nn)1310.2.2 其它插入排序其它插入排序折半插入排序折半插入排序:把把直接插入算法中对插入位置的搜索从直接插入算法中对插入位置的搜索从顺序搜索顺序搜索改进为改进为折半搜索折半搜索.void BInsertSort(SqList&L)for (i=2;i=L.length;+i)if (LT(L.ri.key,L.ri-1.key)L.r0=L.ri;L.ri=L.ri-1;for (j=i-2;LT(L.r0.key,L.rj.key);-j)L.rj+1=L.rj;L.rj+1=L.r0;P267算法算法10.214折半插入
14、排序的性能分析折半插入排序的性能分析:(1)空间空间:只需一个记录的辅助空间只需一个记录的辅助空间r0;(2)时间时间:基本运算基本运算:比较和移动记录比较和移动记录;折半插入排序算法的时间复杂度为折半插入排序算法的时间复杂度为O(nn)152-路插入排序:路插入排序:为减少排序过程中移动记录的次数,在折半插入排序为减少排序过程中移动记录的次数,在折半插入排序的基础上加以改进:的基础上加以改进:例例:有一组待排序的记录的关键字初始排列如下有一组待排序的记录的关键字初始排列如下:(49,38,65,97,76,13,27,49)另另设设一个和一个和r r同类型的数组同类型的数组d d,首先将首先
15、将r r11赋值给赋值给d d1,1,并将并将d d11看成是在排好序的序列中处于中间位置的记录看成是在排好序的序列中处于中间位置的记录,然后从然后从r r中第中第2 2个记个记录起依次插入到录起依次插入到d d11之前或之后的有序序列中:之前或之后的有序序列中:先将待插记录的关先将待插记录的关键字和键字和d1的关键字进行比较的关键字进行比较.若若ri.keyd1.key,则将则将ri插入到插入到d1之前的有序表中之前的有序表中,反之反之,则将则将ri插入到插入到d1之后的有序表中之后的有序表中.算法实现的关键设计算法实现的关键设计:将将d看成是一个循环数组看成是一个循环数组,并设两个指针并设
16、两个指针first和和final分别指示排序过分别指示排序过程中得到的有序序列中的第一个记录和最后一个记录在程中得到的有序序列中的第一个记录和最后一个记录在d中的位置中的位置.16 d1 d2 d3 d4 d5 d6 d7 d8 初始关键字初始关键字49 38 65 97 76 13 27 49i=1:49first finali=2:4938firstfinali=3:493865finalfirsti=4:49386597finalfirsti=5:4938657697finalfirsti=6:493865769713finalfirsti=7:49386576971327finalfi
17、rsti=8:4949657697132738finalfirst172-路插入排序的性能分析路插入排序的性能分析:(1)空间空间:(2)时间时间:基本运算基本运算:比较和移动记录比较和移动记录;2-路插入排序算法的时间复杂度为路插入排序算法的时间复杂度为O(nn)1810.2.3 希尔排序希尔排序从直接插入排序从直接插入排序待待排序序列基本有序可提高效率排序序列基本有序可提高效率待排序序列的记录数待排序序列的记录数n很小时可提高效率很小时可提高效率希尔希尔排序的基本思想排序的基本思想:先将整个待排记录序列分割成为若干子序列分别进行先将整个待排记录序列分割成为若干子序列分别进行直接插入排序直接
18、插入排序,待整个序列中的记录待整个序列中的记录“基本有序基本有序”时时,再对再对全全体记录进行一次直接插入排序体记录进行一次直接插入排序.例例:有一组待排序的记录的关键字初始排列如下有一组待排序的记录的关键字初始排列如下:(49,38,65,97,76,13,27,49)19初始关键字初始关键字r0 r1 r2 r3 r4 r5 r6 r7 r8 49 38 65 97 76 13 27 49第一趟排序后第一趟排序后:(d1=3)27 38 13 49 49 65 97 76第二趟排序后第二趟排序后:(d2=2)13 27 49 97第三趟排序后第三趟排序后:(d3=1)13 27 38 49
19、 49 65 76 97 38 49 65 7620希尔排序算法的实现希尔排序算法的实现:Void shellsort(sqlist&L,int dlta,int t)for (i=0;it;+i)以以dltai为增量的一趟排序;为增量的一趟排序;Shellinsert(sqlist&L,dltai);Void insertsort(sqlist&L)for (i=2;i=L.length;+i)if (LT(L.ri.key,L.ri-1.key)L.r0=L.ri;L.ri=L.ri-1;For (j=i-2;LT(L.r0.key,L.rj.key);-j)L.rj+1=L.rj;L.r
20、j+1=L.r0;(1)记录的增量记录的增量为为dk;(2)r0不是哨不是哨兵。兵。j=0,插,插入位置已找到。入位置已找到。P272算法算法10.421希尔排序的性能分析:希尔排序的性能分析:(1)空间空间:只需一个记录的辅助空间只需一个记录的辅助空间r0;(2)时间时间:基本运算基本运算:比较和移动记录比较和移动记录;时间复杂度为:时间复杂度为:O(n3/2)增量的取法应注意:使增量序列中的值没有除增量的取法应注意:使增量序列中的值没有除1之外的公之外的公 因子,并且最后一个增量值必须为因子,并且最后一个增量值必须为1。2210.3 快速排序快速排序起泡排序的基本思想起泡排序的基本思想:首
21、先将第一个记录的关键字和第二个记录的关键字进首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二行比较,若为逆序,则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。直至第个记录和第三个记录的关键字。直至第n-1个记录和第个记录和第n个个记录的关键字进行过比较为止。记录的关键字进行过比较为止。然后进行第二趟起泡排序,对前然后进行第二趟起泡排序,对前n-1个记录进行同样操作。个记录进行同样操作。结束的条件结束的条件:(1)趟数为趟数为n-1;(2)直到在某趟排序过程中没有直到在某趟排序过程中没有进行过交换进行过交换记录的操作为止。记录的操作为止
22、。23例例:有一组待排序的记录的关键字初始排列如下有一组待排序的记录的关键字初始排列如下:(49,38,65,97,76,13,27,49)第一趟第一趟:49386597761327493849659776132749384965977613274938496597761327493849657697132749384965761397274938496576132797493849657613274997第一趟进行第一趟进行7次比较次比较2449386597761327493849657613274997初初始始关关键键字字第第一一趟趟排排序序后后38496513274976第第二二趟趟排排
23、序序后后384913274965第第三三趟趟排排序序后后3813274949第第四四趟趟排排序序后后13273849第第五五趟趟排排序序后后132738第第六六趟趟排排序序后后1327第第七七趟趟排排序序后后整整个个排排序序过过程程25起泡排序算法的性能分析起泡排序算法的性能分析:(1)空间空间:只需一个记录的辅助空间只需一个记录的辅助空间.(2)时间时间:基本运算基本运算:比较和移动记录比较和移动记录;比较和移动记录的次数与关键字的初始序列有关比较和移动记录的次数与关键字的初始序列有关:(1)待排序序列关键字正序排序待排序序列关键字正序排序:关键字比较次数关键字比较次数:n-1 移动记录的次
24、数移动记录的次数:0(2)待排序序列关键字逆序排序待排序序列关键字逆序排序:关键字比较次数关键字比较次数:(n-1)+(n-2)+1=n(n-1)/2 移动记录的次数移动记录的次数:3n(n-1)/2(3)待排序序列关键字随机排序待排序序列关键字随机排序:关键字比较次数关键字比较次数:(n-1)(n+2)/4 移动记录的次数移动记录的次数:3n(n-1)/4起泡排序算法的起泡排序算法的时间复杂度为时间复杂度为O(nn)26快速排序的基本思想快速排序的基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的
25、关键字小,则可分别对这两部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。录继续进行排序,以达到整个序列有序。算法实现分析:算法实现分析:(1)假设待排序的序列为)假设待排序的序列为L.rs,L.rs+1,L.rt;(2)任意选取一个记录作为枢轴,然后重新排列其余记录,将所任意选取一个记录作为枢轴,然后重新排列其余记录,将所 有关键字较它小的记录都安置在它的位置之前,所有关键字有关键字较它小的记录都安置在它的位置之前,所有关键字 较它大的记录都安置在它的位置之后。较它大的记录都安置在它的位置之后。由此可由此可以该枢轴记录所在的位置以该枢轴记录所
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十章 排序62833 第十 排序 62833
限制150内