数据结构Chap10 排序.ppt
《数据结构Chap10 排序.ppt》由会员分享,可在线阅读,更多相关《数据结构Chap10 排序.ppt(73页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 CSU数据结构 陈淑红中南大学中南大学中南大学信息院计科系中南大学信息院计科系主讲人:王国军主讲人:王国军http:/ 内部排序内部排序 提提 纲纲 10.1 概述 10.2 插入排序 10.3 快速排序 10.4 选择排序 10.5 归并排序 10.6 基数排序 10.7 各种内部排序方法的比较讨论排序定义排序定义将一组数据元素(或记录)的任意序列,重新排列成一个按关键字有序排列(升序或降序)的序列。10.1 10.1 概述概述排序是计算机程序设计中的一种重要运算,是计算机处理数据时一种频繁要做的工作。关键字将随着用户的要求不同而不同。如:人事档案文件可按年龄、工资或文化水平进行排序,从而
2、获得不同的有序文件。按待排序记录所在位置按待排序记录所在位置内部排序:内部排序:待排序记录存放在内存中进行的排序外部排序:外部排序:待排序记录的数量很大,以至于内存一次不能容纳全部记录,在排序过程中需对外存进行访问的排序排序分类排序分类插入排序:插入排序:直接插入排序、折半插入排序、希尔排序交换排序:交换排序:冒泡排序、快速排序选择排序:选择排序:简单选择排序、堆排序归并排序:归并排序:2-路归并排序基数排序基数排序按排序依据原则按排序依据原则简单的排序方法:简单的排序方法:T(n)=O(n)先进的排序方法:先进的排序方法:T(n)=O(nlogn)基数排序:基数排序:T(n)=O(dn)按排
3、序所需工作量按排序所需工作量n为记录的个数,为记录的个数,d为关键字的位数为关键字的位数排序基本操作排序基本操作比较两个关键字大小将记录从一个位置移动到另一个位置评价一个排序方法好坏的标准评价一个排序方法好坏的标准排序所需比较关键字的次数排序所需移动记录的次数排序过程中所需的辅助空间的大小算法本身的复杂程度少少少少小小插入排序的准则:插入排序的准则:在有序序列中插入新的记录以达到扩大有序区的长度的目的。直接插入排序直接插入排序排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序。10.2 10.2 插入排序插入排
4、序例例1 149 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 (13 38 49 65 76 97)27i=1 ()i=7 (13 38 49 65 76 97)2727jjjjjj977665493827 (13 27 38 49 65 76 97)排序结果:排序结果:监视哨L.r0void InsertSort(SqList&L)/对顺序表L作直接插入排序 for(
5、i=2;i=L.length;+i)if(L.ri.key L.ri-1.key)/将 L.ri 插入有序子表L.r0=L.ri;L.ri=L.ri-1;for(j=i-2;L.r0.key L.rj.key;-j)L.rj+1=L.rj;/记录后移L.rj+1=L.r0;/插入到正确位置/if/InsertSort算法描述算法描述时间复杂度时间复杂度若待排序记录按关键字从小到大排列(正序)关键字比较次数:记录移动次数:0若待排序记录按关键字从大到小排列(逆序)关键字比较次数:记录移动次数:T(nT(n)=O(n)=O(n)算法评价算法评价若待排序记录是随机的,取上述最大最小的平均值 关键字比
6、较次数:记录移动次数:空间复杂度:空间复杂度:S(n)=O(1)排序过程:排序过程:用折半查找方法确定插入位置的排序例例2:i=1 (30)13 70 85 39 42 6 20i=2 13 (13 30)70 85 39 42 6 20i=7 6 (6 13 30 39 42 70 85)20.i=8 20 (6 13 30 39 42 70 85)20lhmi=8 20 (6 13 30 39 42 70 85)20lhmi=8 20 (6 13 30 39 42 70 85)20lhm i=8 20 (6 13 30 39 42 70 85)20lhi=8 20 (6 13 20 30
7、39 42 70 85)折半插入排序折半插入排序算法描述算法描述void BInsertSort(SqList&L)/对顺序表L作折半插入排序for(i=2;i=L.length;+i)L.r0=L.ri;/将L.ri暂存到L.r0low=1;high=i-1;while(low=high)/在rlow.high中折半查找有序插入的位置 m=(low+high)/2;/折半 if(L.r0.key=low;-j)L.rj+1=L.rj;/记录后移L.rhigh+1=L.r0;/插入/BInsertSort算法评价算法评价T(nT(n)=O(n)=O(n)时间复杂度:时间复杂度:S(n)=O(1
8、)仅减少了关键字的比较次数,而记录的移动次数不变,所以时间复杂度仍然为空间复杂度:空间复杂度:希尔排序希尔排序(缩小增量法缩小增量法)排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d20)for(i=d;i=0&Rj.keyRj+d.key)temp=Rj;/*Rj与Rj+d交换*/Rj=Rj+d;Rj+d=temp;j=j-d;d=d/2;/*递减增量d*/由于没有负数的下标,在dk1时需对j循环中以防出界另作j0的判别,即L.r0 不再起到监视哨的作用,而仅仅作为一个暂存记录的空间。算法描述算法描述2 2void ShellInsert(SqLis
9、t&L,int dk)/对顺序表序表L作一趟增量作一趟增量为dk的希的希尔排序排序 for(i=dk+1;i=L.length;+i)if(L.ri.key 0&L.r0.key L.rj.key;j-=dk)L.rj+dk=L.rj;/记录后移后移L.rj+dk=L.r0;/插入到正确位置插入到正确位置/if/ShellInsertvoid ShellSort(SqList&L,int dlta,int t)/按增量序列按增量序列 dlta0.t-1 对顺序表序表L作希作希尔排序排序for(k=0;k1&change;-i)change=FALSE;for(j=1;j L.rj+1.key)
10、L.rjL.rj+1;change=TRUE;/for i/BubbleSort算法描述算法描述最好情况(正序)比较次数:n-1 移动次数:0最坏情况(逆序)比较次数:移动次数:算法评价算法评价T(nT(n)=O(n)=O(n)时间复杂度:时间复杂度:S(n)=O(1)空间复杂度:空间复杂度:基本思想:基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。排序过程:排序过程:对rst中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=rs,x=rp.key快速排序快速排序 初始时令i
11、=s,j=t 首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换 再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换 重复上述两步,直至i=j为止 再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止。初始关键字:初始关键字:49 38 65 97 76 13 27 50 ijX=49ji 完成一趟排序:完成一趟排序:(27 38 13)49 (76 97 65 50)第二趟排序:第二趟排序:(13)27 (38)49 (76 97 65 50)快速排序结束:快速排序结束:13 27 38 49 50 65 76 974927ijijij4965ji13
12、49ij4997ij分别进行快速排序:分别进行快速排序:第三趟排序:第三趟排序:(13)27 (38)49 (50 65)76 (97)例例6 6:void QuickSort(RecType R,int s,int t)/*对对Rs至至Rt的元素进行快速排序的元素进行快速排序*/int i=s,j=t;RecType temp;if(si&Rj.keytemp.key)j-;if(ij)/*表示找到这样的表示找到这样的Rj,Ri、Rj交换交换*/Ri=Rj;i+;while(ij&Ri.keytemp.key)i+;if(ij)/*表示找到这样的表示找到这样的Ri,Ri、Rj交换交换*/Rj
13、=Ri;j-;Ri=temp;QuickSort(R,s,i-1);/*对左区间递归排序对左区间递归排序*/QuickSort(R,i+1,t);/*对右区间递归排序对右区间递归排序*/划划分分算法描述算法描述2 2void QSort(RcdType R,int s,int t)/对记录序列 Rs.t 进行快速排序if(s t)/长度大于1pivotloc=Partition(R,s,t);/对 Rs.t 进行一趟快排,并返回枢轴位置QSort(R,s,pivotloc-1);/对低子序列递归进行排序QSort(R,pivotloc+1,t);/对高子序列递归进行排序/if/QSortvoi
14、d QuickSort(SqList&L)/对顺序表 L 进行快速排序QSort(L.r,1,L.length);/QuickSortint Partition(RcdType R,int low,int high)/对记录子序列 Rlow.high 进行一趟快速排序,并返回枢轴记录/所在位置,使得在它之前的记录的关键字均不大于它的关键字,/而在它之后的记录的关键字均不小于它的关键字R0=Rlow;/将枢轴记录移至数组的闲置分量pivotkey=Rlow.key;/枢轴记录关键字while(lowhigh)/从表的两端交替地向中间扫描while(low=pivotkey)-high;Rlow+
15、=Rhigh;/将比枢轴记录小的记录移到低端while(lowhigh&Rlow.key=pivotkey)+low;Rhigh-=Rlow;/将比枢轴记录大的记录移到高端/whileRlow=R0;/枢轴记录移到正确位置return low;/返回枢轴位置/Partition算法评价算法评价T(nT(n)=O(n)=O(n)时间复杂度:时间复杂度:最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n)为避免出现枢轴记录关键字为最大或最小的情况,通常进行的快速排序采用三者取中的改进方案,即以 Rs、Rt 和 R(s+t)/
16、2 三者中关键字介于中值者为枢轴。只要将它和 Rs 互换,一次划分的算法仍不变。可以证明,快速排序的平均时间复杂度为O(nlogn),并且在所有平均时间复杂度为O(nlogn)的算法中它是最快的。在三者取中的前提下,对随机的关键字序列,快速排序是目前被认为是最好的排序方法,如果借用冒泡排序中设置记录“交换与否”的布尔变量的作法,快速排序也适用于已经有序的记录序列。最坏情况:一般情况:S(n)=O(n)空间复杂度:空间复杂度:需栈空间以实现递归S(n)=O(log2n)基本思想基本思想:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子表的最后,直到全部记录排序完毕。11.4 11
17、.4 选择排序选择排序两种交换排序两种交换排序:(1)直接选择排序(或称简单选择排序)(2)堆排序排序过程排序过程 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换;再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换;重复上述操作,共进行n-1趟排序后,排序结束。简单选择排序简单选择排序void SelectSort(SqList&L)/对顺序表L作简单选择排序for(i=1;iL.length;+i)/选择第 i 小的记录,并交换到位k=i;for(j=i+1;j=L.length;j+)if(L.rj.key L.rk.k
18、ey)k=j;/在L.ri.L.length中选择关键字最小的记录if(i!=k)L.rk L.ri;/与第 i 个记录互换/for/SelectSort算法描述算法描述 选择排序是否也和插入排序或冒泡排序相类似,在对正序和逆序的待排序列进行排序时,所需进行的比较和移动 次数有很大差别?无论待排序列处于什么状态,选择排序所需进行的“比较”次数都相同,为而移动次数在待排序列为正序时达最小为0,在逆序时达最大为3(n-1)。例例1 1:初始:初始:49 38 65 97 76 13 27 kjjjjjjkki=11349一趟:一趟:13 38 65 97 76 49 27 i=2kkjjjjj27
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构Chap10 排序 数据结构 Chap10
限制150内