第十章排序(精品).ppt
《第十章排序(精品).ppt》由会员分享,可在线阅读,更多相关《第十章排序(精品).ppt(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十章第十章 内部排序内部排序10.1 排序的定义和方法 排序是将无序的记录序列调整为有序记录序列的一种操作。稳定的排序方法稳定的排序方法:对于两个关键字相等的记录在经过排序之后,不改变它们在排序之前在序列中的相对位置。不稳定的排序方法:不稳定的排序方法:对于两个关键字相等的记录在经过排序之后,改变了它们在排序之前在序列中的相对位置。根据在排序过程中涉及的存储器不同,可将排序方法分为两大类:1)内部排序:内部排序:在排序进行的过程中不使用计算机外部存储器的排序过程。2)外部排序:外部排序:在排序进行的过程中需要对外存进行访问的排序过程。本章仅讨论各种内部排序的方法。内部排序的过程是一个逐步扩大
2、记录的“有序序列”区域的长度的过程。大多数排序方法在排序过程中将出现如动画所示“有序”和“无序”两个区域。演示10.2 插入排序 插入排序的准则是,在有序序列中插入新的记录以达到扩大有序区的长度的目的。10.2.1 直接插入排序直接插入排序一趟直接插入排序的基本思想则是:在对记录序列R1.n的排序过程中,区段R1.i-1中的记录已按关键字非递减的顺序排列,将 Ri 插入到有序序列 R1.i-1 中,使区段 R1.i 中的记录按关键字非递减顺序排列。演示实现一趟插入排序的步骤为:1)在 R1.i-1 中查找 Ri 的插入位置,即确定j(0ji)使得R1.j.keyRi.keyRj+1.i-1.k
3、ey2)将 Rj+1.i-1 中的记录后移一个位置;3)将 Ri 插入到 j+1 的位置。算法算法10.2void InsertSort(SqList&L)/对顺序表对顺序表L作直接插入排序作直接插入排序for(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直接插入排序的时间复杂度:直接插入排序的时间复杂度:当待排记录处于“正
4、序”(即记录按关键字从小到大的顺序排列)的情况时,所需进行的关键字比较和记录移动的次数最少(分别为:n-1,0),反之,当待排记录处于“逆序”(即记录按关键字从大到小的顺序排列)的情况时,所需进行的关键字比较和记录移动的次数最多(分别为:,);若待排记录序列处于随机状态,则可以最坏和最好的情况的平均值作为插入排序的时间性能的量度。一般情况下,直接插入排序的时 间复杂度为O(n2)。10.2.2 折半插入排序折半插入排序演示演示算法算法 10.3void BInsertSort(SqList&L)/对顺序表对顺序表L作折半插入排序作折半插入排序for(i=2;i=L.length;+i)L.r0
5、=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折半插入排序只能减少排序过程中关键字比较的时间,并不能减少记录移动的时间,因此折半插入排序的时间复杂度仍为O(n2)。10.2.5 希尔排序希尔排序希尔排序又称“缩小增量排序”,它的 基本思想是,先对待排序列进行“宏观调整”,待序列中的记录“基本有序”时再进行直接插入排序。演示 例如一个
6、含11个关键字的序列(16,25,12,30,47,11,23,36,9,18,31)的希尔排序过程演示 算法算法 10.5void ShellInsert(SqList&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/ShellInsert算法算法 10.6void ShellSort(SqList&L,int dlta,int t)/按增量序
7、列按增量序列 dlta0.t-1 对顺序表对顺序表L作希尔排序作希尔排序for(k=0;kt;+t)ShellInsert(L,dltak);/一趟增量为 dltak 的插入排序/ShellSort希尔排序的时间复杂度和所取增量序列相关,例如已有学者证明,当增量序列为 2t-k-1(k=0,1,,t-1)时,希尔排序的时间复杂度为O(n3/2)。10.3 快速排序10.3.1 起泡排序起泡排序演示 演示 在待排记录处于“正序”时取最小值,此时只需进行一趟起泡排序(比较和移动次数分别为n-1和0),反之,在待排记录处于“逆序”时取最大值,此时需进行 n-1趟起泡(比较和移动次数分别为 和 )。1
8、0.3.2 快速排序快速排序快速排序则是通过一趟排序选定一个关键字 介于“中间”的记录,从而使剩余记录可以分成两 个子序列分别继续排序,通常称该记录为“枢轴”。关键字序列(52,49,80,36,14,75,58,97,23,61)经第1趟快速排序之后为(23,49,14,36)52(75,58,97,80,61)经第2趟快速排序之后为(14)23(49,36)52(61,58)75(80,97)经第3趟快速排序之后为(14,23,36,49,52,58,61,75,80,97)算法算法 10.9void QSort(RcdType R,int s,int t)/对记录序列对记录序列 Rs.t
9、 进行快速排序进行快速排序if(s t)/长度大于1pivotloc=Partition(R,s,t);/对 Rs.t 进行一趟快排,并返回枢轴位置QSort(R,s,pivotloc-1);/对低子序列递归进行排序QSort(R,pivotloc+1,t);/对高子序列递归进行排序/if/Qsort 算法算法 10.10void QuickSort(SqList&L)/对顺序表对顺序表 L 进行快速排序进行快速排序QSort(L.r,1,L.length);/QuickSort一次划分(一趟快速排序)的算法如下:一次划分(一趟快速排序)的算法如下:算法算法 演示演示int Partition
10、(RcdType R,int low,int high)/对记录子序列对记录子序列 Rlow.high 进行一趟快速排序,并返回枢轴记录进行一趟快速排序,并返回枢轴记录/所在位置,使得在它之前的记录的关键字均不大于它的关键字,所在位置,使得在它之前的记录的关键字均不大于它的关键字,/而在它之后的记录的关键字均不小于它的关键字而在它之后的记录的关键字均不小于它的关键字R0=Rlow;/将枢轴记录移至数组的闲置分量pivotkey=Rlow.key;/枢轴记录关键字while(lowhigh)/从表的两端交替地向中间扫描while(low=pivotkey)-high;Rlow+=Rhigh;/将
11、比枢轴记录小的记录移到低端while(lowhigh&Rlow.key=pivotkey)+low;Rhigh-=Rlow;/将比枢轴记录大的记录移到高端/whileRlow=R0;/枢轴记录移到正确位置return low;/返回枢轴位置/Partition可以推证,快速排序的平均时间复杂度为O(nlogn),在三者取中的前 提下,对随机的关键字序列,快速排序是目前被认为是最好 的排序方法。10.4 选择排序法 10.4.1 简单选择排序简单选择排序选择排序的基本思想是,在待排区段的记录序列中选出关键字最大或最小的记录,并将它移动到法定位置。第 i(i=1,2,n-1)趟的简单选择排序(序列
12、中前 i-1 个记录的关键字均小于后 n-i+1 个记录的关键字)的作法是,在后 n-i+1 个记录中选出关键字最小的记录,并将它和第 i 个记录进行互换。算法算法 10.12void SelectSort(SqList&L)/对顺序表对顺序表L作简单选择排序作简单选择排序for(i=1;iL.length;+i)/选择第 i 小的记录,并交换到位j=i;for(k=i+1;k=L.length;k+)/在L.ri.L.length中选择关键字最小的记录if(L.rk.key L.rj.key)j=k;if(i!=j)L.rj L.ri;/与第 i 个记录互换/for/SelectSort10
13、.4.2 树形选择排序树形选择排序10.4.3 堆排序堆排序若含n个元素的序列 k1,k2,kn 满足下列关系则称作“小顶堆”或“大顶堆”。“堆顶”元素为序列中的“最小值”或“最大值”。如:12,39,20,65,47,34,98,81,73,56为“小顶堆”;98,81,34,73,56,12,20,39,65,47为“大顶堆”。可将上述数列视为如下的一个完全二叉树:利用堆的特性进行的排序方法即为“堆排序”,其排序过程如下:假设待排关键字序列为:34,39,20,65,47,12,98,73,81,56 1)先将它调整为大顶堆:98,81,34,73,56,12,20,39,65,47 2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十章 排序精品 第十 排序 精品
限制150内