数据结构讲义第章-排序.ppt
《数据结构讲义第章-排序.ppt》由会员分享,可在线阅读,更多相关《数据结构讲义第章-排序.ppt(81页珍藏版)》请在冰豆网上搜索。
![数据结构讲义第章-排序.ppt](https://file1.bdocx.com/fileroot1/2022-10/7/623a556c-b673-4b10-97d1-1671be57ae35/623a556c-b673-4b10-97d1-1671be57ae351.gif)
第10章排序,10.1概述10.2插入排序10.3选择排序10.4交换排序10.5分配排序10.6归并排序,10.1概述,1.排序的定义为了便于查找,通常希望计算机中的数据表是按关键码有序的。
如有序表的折半查找,查找效率较高。
还有,二叉排序树、B-树和B+树的构造过程就是一个排序过程。
10.1概述,1.排序的定义排序(sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按关键码有序的序列。
10.1概述,1.排序的定义
(1)排序的定义:
假设R1,R2,Rn是由n个记录组成的文件,K1,K2,Kn是排序码集合,所谓排序是将记录按排序码递增(或递减)的排列。
排序码可以是主关键码,也可以是次关键码。
(2)稳定性假设Ki=Kj(1i,jn,ij),且在排序前的序列中Ri领先于Rj(即ij),若在排序后的序列中Ri仍领先于Rj,则称所用的排序方法是稳定的,否则是不稳定的。
10.1概述,1.排序的定义(3)排序的分类:
待排序的记录在排序过程中全部存放在内存的称为内排序,如果排序过程中需要使用外存的称为外排序。
按排序原则,排序分为:
(1)插入排序
(2)选择排序(3)交换排序(4)分配排序(5)归并排序(6)外部排序按排序所需的工作量,排序分为:
(1)简单排序方法,其时间复杂度为O(n2)
(2)先进的排序方法,其时间复杂度为O(nlogn)(3)基数排序,其时间复杂度为O(dn),10.1概述,1.排序的定义(4)排序中的基本操作:
i)比较关键码大小ii)移动记录,(5)对于待排序的记录序列,有三种常见的存储表示方法。
向量结构,即将待排序的记录存放在一组地址连续的存储单元中。
链表结构。
记录向量与地址向量结合,即将待排序记录存放在一组地址连续的存储单元中,同时另设一个指示各个记录位置的地址向量。
10.1概述,1.排序的定义为简单起见,数据的存储结构采取向量的存储结构:
#definen20/记录数typedefintkeytype;typedefstructkeytypekey;datatypeother;rectype;,rectypern+1;,10.1概述,1.排序的定义(6)排序算法的评价:
i)算法的执行时间ii)算法执行时所需的附加空间,10.2插入排序,基本原理:
每步将一个待排序的对象,按其关键字大小,插入到前面已经排好序的一组对象适当位置上,直到对象全部插入为止。
10.2插入排序,10.2.1直接插入排序1、直接插入排序的基本思想先假定第1个记录为有序序列,然后从第2条记录开始,依次将记录插入到前面已经有序的序列中,直至全部记录有序。
一般情况下,第i趟直接插入排序:
将ri插入到已经有序的序列r1.i-1中,使其变成有序序列r1.i。
整个排序进行n-1趟插入。
10.2插入排序,10.2.1直接插入排序2、示例:
初始:
4938659776132749,i=1:
3849659776132749,i=5:
1338496576972749,i=3:
3849659776132749,i=2:
3849659776132749,i=4:
3849657697132749,i=6:
1327384965769749,i=7:
1327384949657697,10.2插入排序,10.2.1直接插入排序3、算法:
voidInsertSort(rectypeR,intn)inti,j;for(i=2;in;i+)R0Ri;for(ji-1;R0.keyRj.key;j-)Rj+1Rj;Rj+1R0,10.2插入排序,10.2.1直接插入排序4、算法分析:
空间效率:
只需要一个记录的辅助空间。
时间效率:
比较记录的次数为:
最小:
n-1次;最大:
(n+2)(n-1)/2次移动记录的次数:
最小:
2(n-1)最大:
(n+4)(n-1)/2平均情况:
O(n2),10.2插入排序,10.2.2折半插入排序1、折半插入排序:
将直接插入排序的查找过程改用折半查找。
由此实现的排序称为二分法插入排序。
10.2插入排序,10.2.2折半插入排序2、示例:
(1)1327384965769749low=1mid=4high=7
(2)1327384965769749low=5mid=6high=7(3)1327384965769749low=5mid=5high=549high已找到插入位置low=5(4)1327384949657697,10.2插入排序,10.2.2折半插入排序3、算法:
voidBinInsertSort(rectyper,intn)for(i=2;i=low;-j)rj+1=rj;/*记录后移*/rlow=x;/*插入记录*/,10.2插入排序,10.2.2折半插入排序4、算法分析:
算法分析:
空间效率:
同直接插入排序时间效率:
比较次数确定:
nlog2inlog2ni=1移动记录次数:
平均移动次数为O(n2)时间复杂度为O(n2),10.2插入排序,10.2.3希尔排序(ShellsSort)1、希尔排序:
shell排序又称缩小增量排序(DiminishingIncrementSort)。
先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序“时,再对全体记录进行一次直接插入排序,就可以完成整个的排序工作。
利用下面两点:
当n很小时,直接插入排序的效率较高;当待排记录序列基本有序时,直接插入排序的效率也较高。
shell排序对直接插入排序算法进行改进。
10.2插入排序,10.2.3希尔排序(ShellsSort)2、示例:
原始序列49386597137627491.d=42.d=213382749497665973.d=11338274949766597排序结果1327384949657697,10.2插入排序,10.2.3希尔排序(ShellsSort)3、算法:
voidshellSort(rectyper,intn,intd,intk)for(l=0;l0,10.2插入排序,10.2.3希尔排序(ShellsSort)4、算法分析:
Shell排序的平均比较次数和平均移动次数都为O(n1.3)左右Shell排序算法中增加了一个辅助空间。
Shell排序是不稳定的。
10.3交换排序,交换排序基本思想:
两两比较待排序记录的排序码,交换不满足排序要求的偶对,直到全部有序。
10.3交换排序,10.3.1冒泡排序(BubbleSort)1、基本思想:
设待排序记录顺序存放在R1,R2,R3,Rn中:
依次比较(R1,R2),(R2,R3),(Rn-1,Rn),不满足顺序则交换,结果,最大者在Rn中。
这叫一次起泡。
此后,再对存放在R1,R2,R3,Rn-1中n-1个记录作同样处理,结果,最大者在Rn-1中。
n-1次起泡能完成排序。
设置标志noswap表示本次起泡是否有交换,若无交换,表示排序完成。
10.3交换排序,10.3.1冒泡排序(BubbleSort)2、示例:
3849657613274997,4938659776132749,3849651327497697,3849132749657697,3813274949657697,1327384949657697,1327384949657697,初始123456,10.3交换排序,10.3.1冒泡排序(BubbleSort)3、算法:
voidbubbleSort(rectypeR,intn)i=1;flag=1;for(i=1;iRj+1.key)tempRj+1;Rj+1=Rj;Rjtemp;flag1;,10.3交换排序,10.3.1冒泡排序(BubbleSort)4、算法分析:
起泡排序的最坏时间复杂度为O(n2),平均时间复杂度为O(n2)。
起泡排序算法中增加一个辅助空间temp,辅助空间为S(n)=O
(1)。
起泡排序是稳定的。
10.3交换排序,10.3.2快速排序(QuickSort)1、基本思想:
快速排序的基本思想是:
从待排序记录序列中选取一个记录(通常选取第一个记录)作为“枢轴”,通过一趟排序(一次划分)将待排记录分割成独立的两部分,其中一部分记录的关键字比枢轴小,另一部分记录的关键字比枢轴大。
然后则可分别对这两部分记录继续进行划分,以达到整个序列有序。
10.3交换排序,10.3.2快速排序(QuickSort)1、基本思想:
一趟快速排序(一次划分)的具体做法是:
附设两个指针low和high,它们的初值分别是一个序列的第一个和最后一个记录的位置,设枢轴记录的关键字为pivotKey,在首先从high所指位置起向前搜索直到第一个关键字小于pivotKey的记录和枢轴记录交换,然后从low所指位置起向后搜索,找到第一个关键字大于pivotKey的记录和枢轴记录互相交换,重复交替这两步直到low=high为止。
10.3交换排序,10.3.2快速排序(QuickSort)2、示例:
设记录的关键码序列为:
4938659776132749对其进行快速排序。
10.3交换排序,10.3.2快速排序(QuickSort)3、算法:
intPartition(rectypeR,intn,intlow,inthigh)pivotkey=Rlow.key;while(low=pivotkey)-high;rlow=rhigh;while(lowhigh),10.3交换排序,10.3.2快速排序(QuickSort)3、算法:
voidQSort(rectypeR,intn,intlow,inthigh)if(lowhigh)pivotloc=Partition(R,n,low,high);QSort(R,low,pivotloc-1);QSort(R,pivotloc+1,high);voidQuickSort(rectypeR,intn)QSort(R,n,1,n);,10.3交换排序,10.3.2快速排序(QuickSort)4、算法分析:
最坏情况下,即当初始序列已经有序时,快速排序退化为起泡排序,为O(n2)。
最好时间复杂度为O(nlog2n)。
平均时间复杂度是T(n)=O(nlog2n)。
算法需要一个栈空间实现递归。
栈的大小取决于递归调用的深度,最多不超过n,理想情况下不超过log2n。
所以快速排序的辅助空间最坏为S(n)=O(n),最好为S(n)=O(log2n)。
快速排序是不稳定的。
10.4选择排序,选择排序(SelectionSort)的基本思想是:
每一趟在n-i+1(i=1,2,n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。
10.4选择排序,10.4.1简单选择排序(SimpleSelectionSort)1、基本思想:
第i趟简单选择排序是指通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i个记录进行交换。
共需进行i-1趟比较,直到所有记录排序完成为止。
10.4选择排序,10.4.1简单选择排序(SimpleSelectionSort)2、示例:
4938659749132776,1338659749492776,1327659749493876,1327389749496576,1327384997496576,1327384949