数据结构第9章排序.ppt
《数据结构第9章排序.ppt》由会员分享,可在线阅读,更多相关《数据结构第9章排序.ppt(89页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第9章章 排排 序序 在信息处理过程中,最基本的操作是查找。从查在信息处理过程中,最基本的操作是查找。从查找来说,效率最高的是折半查找,折半查找的前提是所找来说,效率最高的是折半查找,折半查找的前提是所有的数据元素有的数据元素(记录记录)是按关键字有序的。需要将一个无是按关键字有序的。需要将一个无序的数据文件转变为一个有序的数据文件。序的数据文件转变为一个有序的数据文件。将任一文件中的记录通过某种方法整理成为按将任一文件中的记录通过某种方法整理成为按(记记录录)关键字有序排列的处理过程称为关键字有序排列的处理过程称为排序排序。排序是排序是数据处理数据处理中一种中一种最常用的操作最常用的操作。
2、9.1 排序的基本概念排序的基本概念 排序排序(Sorting)排序排序是将一批是将一批(组组)任意次序的记录重新排列成任意次序的记录重新排列成按按关键字有序关键字有序的记录序列的过程,其定义为的记录序列的过程,其定义为:给定一组记录序列给定一组记录序列:R1,R2,Rn,其相应的其相应的关键字序列是关键字序列是K1,K2,Kn。确定确定1,2,n的一个的一个排列排列p1,p2,pn,使其相应的关键字满足如下非递使其相应的关键字满足如下非递减减(或非递增或非递增)关系关系:Kp1Kp2 Kpn的序列的序列Kp1,Kp2,Kpn,这种操作称为排序。这种操作称为排序。关键字关键字Ki可以是记录可以
3、是记录Ri的主关键字的主关键字,也可以是次关也可以是次关键字或若干数据项的组合。键字或若干数据项的组合。Ki是主关键字:排序后得到的结果是唯一的;是主关键字:排序后得到的结果是唯一的;Ki是次关键字:排序后得到的结果是不唯一的。是次关键字:排序后得到的结果是不唯一的。排序的稳定性排序的稳定性 若记录序列中有若记录序列中有两个或两个以上关键字相等两个或两个以上关键字相等的记的记录:录:Ki=Kj(ij,i,j=1,2,n),且在排序前且在排序前Ri先于先于Rj(ij),排序后的记录序列仍然是排序后的记录序列仍然是Ri先于先于Rj,称排序方称排序方法是稳定的,否则是不稳定的。法是稳定的,否则是不稳
4、定的。排序算法有许多,但就全面性能而言,还没有一种排序算法有许多,但就全面性能而言,还没有一种公认为最好的。每种算法都有其优点和缺点,分别适合公认为最好的。每种算法都有其优点和缺点,分别适合不同的数据量和硬件配置。不同的数据量和硬件配置。评价排序算法的标准有:评价排序算法的标准有:执行时间执行时间和和所需的辅助空所需的辅助空间间,其次是,其次是算法的稳定性算法的稳定性。若排序算法所需的辅助空间不依赖问题的规模若排序算法所需的辅助空间不依赖问题的规模n,即空间复杂度是即空间复杂度是O(1),则称排序方法是则称排序方法是就地排序就地排序,否则,否则是是非就地排序非就地排序。排序的分类排序的分类 待
5、排序的记录数量不同,排序过程中涉及的存储器待排序的记录数量不同,排序过程中涉及的存储器的不同,有不同的排序分类。的不同,有不同的排序分类。待排序的记录数不太多待排序的记录数不太多:所有的记录都能存放在:所有的记录都能存放在内存中进行排序,称为内存中进行排序,称为内部排序内部排序;待排序的记录数太多待排序的记录数太多:所有的记录不可能存放在:所有的记录不可能存放在内存中,内存中,排序过程中必须在内、外存之间进行数据排序过程中必须在内、外存之间进行数据交换,这样的排序称为交换,这样的排序称为外部排序外部排序。内部排序的基本操作内部排序的基本操作 对内部排序地而言,其基本操作有两种对内部排序地而言,
6、其基本操作有两种:比较两个关键字的大小;比较两个关键字的大小;存储位置的移动:从一个位置移到另一个位置。存储位置的移动:从一个位置移到另一个位置。第一种操作是必不可少的;而第二种操作却不是必第一种操作是必不可少的;而第二种操作却不是必须的,取决于记录的存储方式,具体情况是:须的,取决于记录的存储方式,具体情况是:记录存储在一组连续地址的存储空间记录存储在一组连续地址的存储空间:记录之间:记录之间的逻辑顺序关系是通过其物理存储位置的相邻来体现,的逻辑顺序关系是通过其物理存储位置的相邻来体现,记录的移动是必不可少的记录的移动是必不可少的;记录采用链式存储方式记录采用链式存储方式:记录之间的逻辑顺序
7、关:记录之间的逻辑顺序关系是通过结点中的指针来体现,排序过程系是通过结点中的指针来体现,排序过程仅需修改结仅需修改结点的指针点的指针,而,而不需要移动记录不需要移动记录;记录存储在一组连续地址的存储空间记录存储在一组连续地址的存储空间:构造另一:构造另一个辅助表来保存各个记录的存放地址个辅助表来保存各个记录的存放地址(指针指针):排:排序过程序过程不需要移动记录不需要移动记录,而,而仅需修改辅助表中的仅需修改辅助表中的指针指针,排序后视具体情况决定是否调整记录的存,排序后视具体情况决定是否调整记录的存储位置。储位置。比较适合记录数较少的情况;而比较适合记录数较少的情况;而、则适合记则适合记录数
8、较多的情况。录数较多的情况。为讨论方便,假设待排序的记录是以为讨论方便,假设待排序的记录是以的情况存的情况存储,且设排序是按升序排列的;关键字是一些可直储,且设排序是按升序排列的;关键字是一些可直接用比较运算符进行比较的类型。接用比较运算符进行比较的类型。待排序的记录类型的定义如下:待排序的记录类型的定义如下:#define MAX_SIZE 100Typedef int KeyType;typedef struct RecType KeyType key;/*关键字码关键字码 */infoType otherinfo;/*其他域其他域 */RecType;typedef struct Sql
9、ist RecType RMAX_SIZE;int length ;Sqlist;9.2 插入排序插入排序 采用的是以采用的是以“玩桥牌者玩桥牌者”的方法为基础的的方法为基础的。即在考。即在考察记录察记录Ri之前之前,设以前的所有记录,设以前的所有记录R1,R2,.,Ri-1已排已排好序好序,然后将,然后将Ri插入到插入到已排好序的诸记录的适当位置已排好序的诸记录的适当位置。最基本的插入排序是最基本的插入排序是直接插入排序直接插入排序(Straight Insertion Sort)。9.2.1 直接插入排序直接插入排序1 排序思想排序思想 将待排序的记录将待排序的记录Ri,插入到已插入到已排
10、好序的排好序的记录表记录表R1,R2,.,Ri-1中中,得到一个新的、记录数增加,得到一个新的、记录数增加1的有序表的有序表。直到所有的记录都插入完为止直到所有的记录都插入完为止。设设待排序的记录顺序存放在数组待排序的记录顺序存放在数组R1n中,在排序中,在排序的某一时刻,将记录序列分成两部分:的某一时刻,将记录序列分成两部分:R1i-1:已:已排好序的有序部分排好序的有序部分;Rin:未:未排好序的无序部分。排好序的无序部分。显然,在刚开始排序时,显然,在刚开始排序时,R1是已经是已经排好序的。排好序的。例例:设有关键字序列为:设有关键字序列为:7,4,-2,19,13,6,直接插,直接插入
11、排序的过程如下图入排序的过程如下图9-1所示:所示:初始记录的关键字初始记录的关键字:7 4 -2 19 13 6第一趟排序第一趟排序:4 7 -2 19 13 6第二趟排序第二趟排序:-2 4 7 19 13 6第三趟排序第三趟排序:-2 4 7 19 13 6第四趟排序第四趟排序:-2 4 7 13 19 6第五趟排序第五趟排序:-2 4 6 7 13 19图图9-1 直接插入排序的过程直接插入排序的过程2 算法实现算法实现void straight_insert_sort(Sqlist*L)int i,j;for(i=2;ilength;i+)L-R0=L-Ri;j=i-1;/*设置哨兵
12、设置哨兵 */while(LT(L-R0.key,L-Rj.key)L-Rj+1=L-Rj;j-;/*查找插入位置查找插入位置 */L-Rj+1=L-R0;/*插入到相应位置插入到相应位置 */3 算法说明算法说明 算法中的算法中的R0开始时并不存放任何待排序的记录,开始时并不存放任何待排序的记录,引入的作用主要有两个:引入的作用主要有两个:不需要增加辅助空间:不需要增加辅助空间:保存当前待插入的记录保存当前待插入的记录Ri,Ri会会因为记录的后移而被占用;因为记录的后移而被占用;保证查找插入位置的内循环总可以在超出循环边保证查找插入位置的内循环总可以在超出循环边界之前找到一个等于当前记录的记
13、录,起界之前找到一个等于当前记录的记录,起“哨兵监视哨兵监视”作用,避免在内循环中每次都要判断作用,避免在内循环中每次都要判断j是否越界是否越界。4 算法分析算法分析 最好情况最好情况:若待排序记录按关键字从小到大排若待排序记录按关键字从小到大排列列(正序正序),算法中的内循环无须执行,算法中的内循环无须执行,则一趟排序时:则一趟排序时:关键字比较次数关键字比较次数1次,记录移动次数次,记录移动次数2次次(RiR0,R0Rj+1)。则整个排序的关键字比较次数和记录移动次数分别则整个排序的关键字比较次数和记录移动次数分别是:是:比较次数比较次数:1=n-1ni=2移动次数移动次数:2=2(n-1
14、)ni=2 最坏情况最坏情况:若待排序记录按关键字从大到小排若待排序记录按关键字从大到小排列列(逆序逆序),则一趟排序时:算法中的内循环体执行,则一趟排序时:算法中的内循环体执行i-1,关键字比较次数关键字比较次数i次,记录移动次数次,记录移动次数i+1。则就整个排序而言:则就整个排序而言:比较次数比较次数:i=ni=2(n-1)(n+1)2移动次数移动次数:(i+1)=ni=2(n-1)(n+4)2 一般地一般地,认为,认为待排序的记录可能出现的各种排列的待排序的记录可能出现的各种排列的概率相同概率相同,则取以上两种情况的平均值,作为排序的,则取以上两种情况的平均值,作为排序的关关键字比较次
15、数和记录移动次数键字比较次数和记录移动次数,约为约为n2/4,则,则复杂度为复杂度为O(n2)。9.2.2 其它插入排序其它插入排序1 折半插入排序折半插入排序 当将待排序的记录当将待排序的记录Ri 插入到已排好序的记录子表插入到已排好序的记录子表R1i-1中时,由于中时,由于R1,R2,Ri-1已排好序,则查找已排好序,则查找插入位置可以用插入位置可以用“折半查找折半查找”实现,则直接插入排序就实现,则直接插入排序就变成为折半插入排序。变成为折半插入排序。算法实现算法实现void Binary_insert_sort(Sqlist*L)int i,j,low,high,mid;for(i=2
16、;ilength;i+)L-R0=L-Ri;/*设置哨兵设置哨兵 */low=1;high=i-1;while(lowR0.key,L-Rmid.key)high=mid-1;else low=mid+1;/*查找插入位置查找插入位置 */for(j=i-1;j=high+1;j-)L-Rj+1=L-Rj;L-Rhigh+1=L-R0;/*插入到相应位置插入到相应位置 */从时间上比较从时间上比较,折半插入排序仅仅减少了关键字的,折半插入排序仅仅减少了关键字的比较次数比较次数,却没有减少,却没有减少记录的移动次数记录的移动次数,故时间故时间复杂度复杂度仍然为仍然为O(n2)。排序示例排序示例
17、设有一组关键字设有一组关键字30,13,70,85,39,42,6,20,采用折采用折半插入排序方法排序的过程如图半插入排序方法排序的过程如图9-2所示:所示:i=1 (30)13 70 85 39 42 6 20i=2 13 (13 30)70 85 39 42 6 20 i=7 6 (6 13 30 39 42 70 85)20i=8 20 (6 13 30 39 42 70 85)20lowhighmidi=8 20 (6 13 30 39 42 70 85)20lowhighmidi=8 20 (6 13 30 39 42 70 85)20mid highlowi=8 20 (6 13
18、 20 30 39 42 70 85)图图9-2 折半插入排序过程折半插入排序过程2 2-路插入排序路插入排序 是对折半插入排序的改进是对折半插入排序的改进,以减少排序过程中移动以减少排序过程中移动记录的次数记录的次数。附加附加n个记录的辅助空间个记录的辅助空间,方法是,方法是:另设一个和另设一个和L-R同同类型的数组类型的数组d,L-R1赋给赋给d1,将,将d1看成是排好序的序列中中间位置的记录;看成是排好序的序列中中间位置的记录;分别将分别将L-R 中的第中的第i个记录依次插入到个记录依次插入到d1之之前或之后前或之后的有序序列中,具体方法的有序序列中,具体方法:L-Ri.keyRi插入到
19、插入到d1之前之前的有序表中;的有序表中;L-Ri.keyd1.key:L-Ri插入到插入到d1之后之后的有序表中;的有序表中;关键点关键点:实现时将实现时将向量向量d看成是循环向量看成是循环向量,并设两个指,并设两个指针针first和和final分别指示排序过程中得到的有序序列中的分别指示排序过程中得到的有序序列中的第一个和最后一个记录第一个和最后一个记录。排序示例排序示例设有初始关键字集合设有初始关键字集合49,38,65,13,97,27,76,采,采用用2-路插入排序的过程如右图路插入排序的过程如右图9-3所示。所示。在在2-路插入排序中,移动记录的次数约为路插入排序中,移动记录的次数
20、约为n2/8。但当但当L-R1是待排序记录中关键字最大或最小的记录是待排序记录中关键字最大或最小的记录时,时,2-路插入排序就完全失去了优越性。路插入排序就完全失去了优越性。2776d49firstfirstfirstfirstfinalfinalfinalfinal653897971313图图9-3 2-路插入排序过程路插入排序过程3 表插入排序表插入排序前面的插入排序不可避免地要移动记录,若不移动记录前面的插入排序不可避免地要移动记录,若不移动记录就需要改变数据结构。附加就需要改变数据结构。附加n个记录的辅助空间,记录个记录的辅助空间,记录类型修改为:类型修改为:typedef struc
21、t RecNode KeyType key;infotype otherinfo;int*next;RecNode;初始化初始化:下标值为:下标值为0的分量作为表头结点的分量作为表头结点,关键字取,关键字取为最大值,各分量的指针值为空;为最大值,各分量的指针值为空;将静态链表中将静态链表中数组下标值为数组下标值为1的分量的分量(结点结点)与表与表头结点构成一个循环链表;头结点构成一个循环链表;i=2,将分量将分量Ri按关键字递减插入到循环链表;按关键字递减插入到循环链表;增加增加i,重复,重复,直到全部分量插入到循环链表。,直到全部分量插入到循环链表。例:例:设有关键字集合设有关键字集合49,
22、38,65,97,76,13,27,49,采,采用表插入排序的过程如下图用表插入排序的过程如下图9-4所示所示。0 1 2 3 4 5 6 7 8key域域next域域MAXINT 49 38 65 13 97 27 76 49 1 0 -i=2MAXINT 49 38 65 13 97 27 76 49 2 0 1 -i=3MAXINT 49 38 65 13 97 27 76 49 2 3 1 0 -i=4MAXINT 49 38 65 13 97 27 76 49 4 3 1 0 2 -i=5MAXINT 49 38 65 13 97 27 76 49 4 3 1 5 2 0 -和直接插
23、入排序相比,不同的是修改和直接插入排序相比,不同的是修改2n次指针值以次指针值以代替移动记录,而代替移动记录,而关键字的比较次数相同关键字的比较次数相同,故时间复杂故时间复杂度为度为O(n2)。表表插入排序得到一个有序链表,对其可以方便地进插入排序得到一个有序链表,对其可以方便地进行顺序查找,但不能实现随机查找行顺序查找,但不能实现随机查找。根据需要,可以对根据需要,可以对记录进行重排,记录重排详见记录进行重排,记录重排详见P247。i=6MAXINT 49 38 65 13 97 27 76 49 4 3 1 5 6 0 2 -i=7MAXINT 49 38 65 13 97 27 76 4
24、9 4 3 1 7 6 0 2 5 -i=8MAXINT 49 38 65 13 97 27 76 49 4 8 1 7 6 0 2 5 3图图9-4 表插入排序过程表插入排序过程9.2.3 希尔排序希尔排序 希尔排序希尔排序(Shell Sort,又称,又称缩小增量法缩小增量法)是一种是一种分组插入排序方法分组插入排序方法。1 排序思想排序思想 先取一个正整数先取一个正整数d1(d1n)作为第一个增量,将全作为第一个增量,将全部部n个记录分成个记录分成d1组,组,把所有相隔把所有相隔d1的记录放在一组的记录放在一组中,即对于每个中,即对于每个k(k=1,2,d1),Rk,Rd1+k,R2d1
25、+k,分在分在同一组中同一组中,在各组内进行直接插入,在各组内进行直接插入排序排序。这样一次分组和排序过程称为一趟这样一次分组和排序过程称为一趟希尔排序希尔排序;取新的增量取新的增量d2d1,重复重复的的分组和排序操作;分组和排序操作;直至所取的增量直至所取的增量di=1为止,为止,即所有记录放进一个组中即所有记录放进一个组中排序为止排序为止。2 排序示排序示例例 设有设有10个待排序的记录个待排序的记录,关键字分别为,关键字分别为9,13,8,2,5,13,7,1,15,11,增量序列是,增量序列是5,3,1,希尔排序的过程,希尔排序的过程如图如图9-5所示所示。9 7 1 2 5 13 1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 排序
限制150内