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