数据结构与程序设计第九章排序..ppt
《数据结构与程序设计第九章排序..ppt》由会员分享,可在线阅读,更多相关《数据结构与程序设计第九章排序..ppt(89页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 排序排序 内容提要内容提要:u五类内部排序方法(插入排序、交换排序、选择排序、归并排序和基数排序)的基本思想、排序过程、实现的算法、算法的效率分析及排序的特点;u各种排序方法的比较和选择;u最后简单介绍外部排序。排序的功能是将一个数据元素(记录)的任意序列,重新排列成一个按关键字有序的序列,目的是为了便于查询和处理数据。排序的定义2排序的分类l按待排序记录所在位置按待排序记录所在位置内部排序:待排序记录存放在内存外部排序:排序过程中需对外存进行访问的排序l按排序依据原则按排序依据原则插入排序:直接插入排序、折半插入排序、希尔排序交换排序:冒泡排序、快速排序选择排序:简单选择排序、
2、堆排序归并排序:2-路归并排序3排序的基本操作l比较两个关键字大小比较两个关键字大小l将记录从一个位置移动到另一个位置将记录从一个位置移动到另一个位置4排序的性质排序的性质 如果在待排序的数据中,存在多个如果在待排序的数据中,存在多个关键字相同的数据,经排序后这些数据关键字相同的数据,经排序后这些数据的相对次序仍然保持不变,则称相应的的相对次序仍然保持不变,则称相应的排序方法为稳定方法,否则为不稳定方排序方法为稳定方法,否则为不稳定方法。法。5定义待排序的记录的数据类型为:#define recnum 100 struct rectype int key;int item;struct rec
3、type arecnum+1;排序对象的数据类型6基本思想:每步将一个待排序的记录,按其关键字值的大小插入到前面已经排序的文件中适当的位置上,直到全部插完为止。插入排序基本思路是依次把待排序的记录逐一按其关键字的大小插入到一个已经排好序的有序序列中去,直到所有的记录插完为止。得到一个新的有序序列。插入排序直接插入排序例49 38 65 97 76 13 27i=2 38 (38 49)65 97 76 13 27i=3 65 (38 49 65)97 76 13 27i=4 97 (38 49 65 97)76 13 27i=5 76 (38 49 65 76 97)13 27i=6 13 (
4、13 38 49 65 76 97)27i=1 ()i=7 (13 38 49 65 76 97)2727jjjjjj977665493827 (13 27 38 49 65 76 97)排序结果:比较次数 移动次数1 11 02 1.1 05 56 5插入排序直接插入排序9(1)设置监视哨 a0,将待插入记录的值赋给a0;(2)设置开始查找的位置j;(3)在数组中进行搜索,搜索中将第j个记录后移,直至a0.keyaj.key为止(4)将a0插入在aj+1的位置上直接插入排序算法10void straipass(a,i)struct rectype arecnum+1;int i;int j,
5、x;a0=ai;j=i-1;x=ai.key;11while(xaj.key)aj+1=aj;j=j-1;aj+1=a0;12void straisort(a,j)struct rectype arecnum+1;int j;int i;for(i=2;i=j;i+)straipass(a,i);13按平均比较次数计算,将n个记录进行直接插入排序所需的平均比较次数为:直接插入排序算法分析直接插入排序的时间复杂度为O(n2)。空间复杂度为O(1)直接插入排序是一种稳定的排序方法。14折半插入排序折半插入排序 在进行插入排序时,用折半查找在进行插入排序时,用折半查找法寻找插入位置,从而减少排序过程
6、法寻找插入位置,从而减少排序过程中的比较后移动次数,这就是折半插中的比较后移动次数,这就是折半插入排序。入排序。15折半插入排序的过程折半插入排序的过程l初始化初始化 a0=ai 置折半查找的上下界:置折半查找的上下界:s=1;j=i-1;l当当s=j时重复以下操作:时重复以下操作:m=(s+j)/2;如果如果a0am,则,则j=m-1,否则,否则s=m+116l将插入位置以后的元素向后移一个位将插入位置以后的元素向后移一个位置置l将将a0插入插入as17void binpass(a,i)struct rectype arecnum+1;int i;int x,s,j,m,k;a0=ai;x=
7、ai.key;s=1;j=i-1;18 while(s=j)m=(int)(s+j)/2);if(x=j+1;k-)ak+1=ak;Aj+1=a0;19void binsort(a,j)struct rectype arecnum+1;int j;int i;for(i=2;i=j;i+)binpass(a,i);20 折半插入排序的时间复杂度是折半插入排序的时间复杂度是 O(log2n)这种排序方法也是稳定的。这种排序方法也是稳定的。21 基本思想:把记录按下标的一定增量分组,对每组记录使用直接插入排序。随着增量逐渐缩小,所分成的组所包含的记录越来越多,到增量的值等于1时,所有记录成为一组,
8、且记录已经相对有序,再进行直接插入排序,即可以完成对全部记录的较高效率的排序了。插入排序插入排序希尔排序希尔排序22希尔排序的作法是:选定第一个增量d1n,把全部记录按此值从第一个记录起进行分组,所有相距为d1的记录作为一组,先在各组内进行插入排序,然后减小间隔,取第二个增量d2=0&xr2.key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上。2、对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置。3、重复上述过程,直到“在一趟排序过程中没有进行过交换记录的
9、操作”为止。32例49 38 65 97 76 13 27 30初始关键字38 49 65 76 13 27 30 97第一趟38 49 65 13 27 30 76第二趟38 49 13 27 30 65第三趟38 13 27 30 49第四趟13 27 30 38第五趟13 27 30第六趟38497697139727973097137676762730136527653065131349493049273827383038交换排序交换排序冒泡排序冒泡排序33for(i=1;i=i1-1;i+)for(j=1;jaj+1.key)temp=aj;aj=aj+1;aj+1=temp;34改进
10、算法改进算法mark=i;while(mark)m=mark-1;mark=0;for(j=1;jaj+1.key)temp=aj;aj=aj+1;aj+1=temp;mark=j;35由上述算法可见,当初始序列中记录已按关键字次序排好序,则只需要进行一趟排序,在排序过程中只需要进行n-1次比较,记录移动次数为0;反之,若初始序列中记录按逆序排列,若待排序的序列有n个记录,最多进行n-1趟排序,最大比较次数为冒泡排序算法分析冒泡排序算法分析36 冒泡排序交换记录时移动记录的次数也约为3n2/2次,故总的时间复杂度为O(n2)。冒泡排序是稳定的。37交换排序交换排序快速排序快速排序基本思想:通过
11、一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.keyu初始时令i=s,j=tu首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换u再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换u重复上述两步,直至i=j为止u再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止快速排序的排序过程快速排序的排序过程39例初始关键字:49 38 65 97 76 13 27 50 ijxji 完
12、成一趟排序:(27 38 13)49 (76 97 65 50)分别进行快速排序:(13)27 (38)49 (50 65)76 (97)快速排序结束:13 27 38 49 50 65 76 974927ijijij4965ji1349ij4997ij快速排序的排序过程快速排序的排序过程401)确定第一个记录为基准记录rt,先从j所指示的位置起向前扫描,当rt.keyrj.key时,交换rt.key和rj.key,使关键字值比基准记录的关键字值小的记录交换到前面;2)从i所指示的位置起向后扫描,直到rt.keyri.key,交换rt.key和ri.key,使关键字值比基准记录的关键字值大的记
13、录交换到后面;3)重复(1)和(2),直至i=j为止完成一趟排序;4)只要tw,重复(1)至(3)分别对基准记录两边的部分进行排序。快速排序的排序算法快速排序的排序算法41快速排序平均时间复杂度为O(nlog2 n)。最坏情况下时间复杂度为O(n2),快速排序所需的比较次数反而最多。快速排序法不稳定。快速排序需要一个栈空间来实现递归。栈的最大深度为 log2 n 1,所需栈空间为O(log2 n)。最坏情况下,递归深度为n,所需栈空间为O(n)。快速排序的排序算法分析快速排序的排序算法分析42 选择排序选择排序 选择排序是指每次从待排序的记录中选出关键字值最小(或最大)的记录,顺序放在已排序的
14、有序序列中,直到全部排完。选择排序主要包括简单选择排序和堆排序两种。43选择排序选择排序简单选择排序简单选择排序u首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换u再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换u重复上述操作,共进行n-1趟排序后,排序结束44例初始:49 38 65 97 76 13 27 kjjjjjjkki=11349一趟:13 38 65 97 76 49 27 i=2kkjjjjj2738二趟:13 27 65 97 76 49 38 三趟:13 27 38 97 76 49 65 四趟:13 2
15、7 38 49 76 97 65 五趟:13 27 38 49 65 97 76 六趟:13 27 38 49 65 76 97 排序结束:13 27 38 49 65 76 9745(1)查找待排序序列中最小的记录,并将它和该区间第一个记录交换;(2)重复(1)到第n-1次排序后结束简单选择排序算法简单选择排序算法46 简单选择排序所需要的总的比较次数为O(n2)。当初始文件是有序时,最小移动记录次数等于0,而当初始文件是逆序时,每次都要交换记录。直接选择排序是不稳定的.简单选择排序算法分析简单选择排序算法分析47选择排序选择排序堆排序的引入堆排序的引入 堆排序是简单选择排序的改进。用直接选
16、择排序从n个记录中选出关键字值最小的记录要做n-1次比较,然后从其余n-1个记录中选出最小者要作n-2次比较。显然,相邻两趟中某些比较是重复的。为了避免重复比较,可以采用树形选择排序比较。48(a)求出最小关键字3 (b)求出次小关键字11图 8.8 树形选择排序49树形选择排序总的比较次数为O(nlog2 n),与直接选择排序比较,减少了比较次数,但需要增加额外的存储空间存放中间比较结果和排序结果。选择排序选择排序堆排序的引入堆排序的引入50n个元素的序列(k1,k2,kn),当且仅当满足下列关系时,称之为堆或(i=1,2,.n/2)kik2ikik2i+1kik2ikik2i+1例 (96
17、,83,27,38,11,9)例 (13,38,27,50,76,65,49,97)962791138831327384965765097可将堆序列看成完全二叉树,则堆顶元素(完全二叉树的根)必为序列中n个元素的最小值或最大值堆的定义堆的定义51 堆排序的基本思路:对一组待排序的记录序列,先将其关键字按堆的定义排列个序列(称初建堆),找到了最小(最大)关键字,将其取出。用剩余的n-1个元素再重建堆,便可得到次小(次大)值。如此反复执行,直到全部关键字排好序为止。堆排序的基本思路52例13273849657650979727384965765013输出:132749389765765013输出:
18、139749382765765013输出:13 273849502765769713输出:13 276549502738769713输出:13 27 38534965502738769713输出:13 27 387665502738499713输出:13 27 38 495065762738499713输出:13 27 38 499765762738495013输出:13 27 38 49 506597762738495013输出:13 27 38 49 509765762738495013输出:13 27 38 49 50 65547665972738495013输出:13 27 38 49
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 程序设计 第九 排序
限制150内