数据结构 第八章 排序.ppt
《数据结构 第八章 排序.ppt》由会员分享,可在线阅读,更多相关《数据结构 第八章 排序.ppt(63页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章 排序1本章要点本章要点n排序的基本概念、排序方法分类、稳定性及效率排序的基本概念、排序方法分类、稳定性及效率评价;评价;n插入排序插入排序-直接插入、折半插入、希尔排序;直接插入、折半插入、希尔排序;n交换排序交换排序-冒泡排序、快速排序的;冒泡排序、快速排序的;n 选择排序选择排序-简单选择、树形选择、堆排序;简单选择、树形选择、堆排序;n归并排序;归并排序;n基数排序;基数排序;n外部排序。外部排序。2排序是计算机程序设计中的一种重要操作排序是计算机程序设计中的一种重要操作。在数在数值计算或数据处理过程中,都会直接或间接用到数据值计算或数据处理过程中,都会直接或间接用到数据的排序问
2、题。的排序问题。排序的功能:是将一个数据元素排序的功能:是将一个数据元素(或称为记录或称为记录)的无的无序序列,按数据元素的某个数据项值的大小,排列成序序列,按数据元素的某个数据项值的大小,排列成一个递增或递减的有序的记录序列。一个递增或递减的有序的记录序列。作为排序依据的数据项为关键字,关键字分主关作为排序依据的数据项为关键字,关键字分主关键字和次关键字两种。键字和次关键字两种。3n排序(Sorting)(Sorting):假设含假设含n n 个记录的序列为个记录的序列为:R Rl l,R,R2 2,R,Rn n 其相应的关键字序列为其相应的关键字序列为:K:Kl l,K,K2 2,K,Kn
3、 n 需需确确定定1,2,1,2,n,n的的一一种种排排列列p pl l,p,p2 2,p,pn n,使使其其相相应应的的关关键字满足如下的非递减键字满足如下的非递减(或非递增关系或非递增关系):K Kp1 p1 K Kp2 p2 K Kpnpn 使记录序列成按关键字有序的序列:使记录序列成按关键字有序的序列:R Rp1p1,R,Rp2p2,R,Rpnpn 这样一种操作称为这样一种操作称为排序排序。n排序结果:排序结果:当当K Ki i是主关键字:是主关键字:唯一唯一当当K Ki i是次关键字:是次关键字:不唯一不唯一8.1 8.1 概概 述述4n若若K Ki i=K=Kj j,(1(1 i
4、i j j n),n),且且排排序序前前,R,Ri i在在R Rj j前前面面,若若排排序序后后,R Ri i仍仍在在R Rj j前前面面,则则称称该该排排序序算算法法是是稳定的,否否则则是是不稳定的。n所所谓谓内部排序,是是指指待待排排序序列列完完全全存存放放在在内内存存中中,排序过程中也不需要访问外存储器。排序过程中也不需要访问外存储器。所所谓谓外部排序,是是指指排排序序过过程程中中还还需需访访问问外外存存储储器器的的排序过程。排序过程。n内内部部排排序序的的过过程程是是一一个个逐逐步步扩扩大大记记录录的的有有序序序序列列长长度度的的过过程程。将将一一个个或或多多个个记记录录置置于于合合适
5、适的的位位置置上上的的一一个个完完整过程称为整过程称为一趟。基基于于不不同同的的“扩扩大大”有有序序序序列列长长度度的的方方法法,内内部部排排序序方方法法大大致致可可分分下下列列几几种种类类型型:插插入入排排序序、交交换换排排序序、选选择择排排序序、归并排序、基数排序等。归并排序、基数排序等。5n在排序的过程中需进行的两种基本操作:在排序的过程中需进行的两种基本操作:1)比较两个关键字的大小;比较两个关键字的大小;2)将记录从一个位置移动至另一个位置。将记录从一个位置移动至另一个位置。n待排序数据元素的存储方式:待排序数据元素的存储方式:顺顺序序存存储储方方式式,即即将将一一组组待待排排序序数
6、数据据元元素素存存放放在在一一组组地地址址连续的存储单元中,排序过程中需要元素的比较和移动;连续的存储单元中,排序过程中需要元素的比较和移动;链链式式存存储储方方式式,即即将将一一组组待待排排序序数数据据元元素素存存放放在在动动态态链链表表或或静静态态链链表表中中,排排序序过过程程无无须须移移动动元元素素的的位位置置,只只需需修修改改指针即可;指针即可;数数据据元元素素本本身身按按顺顺序序方方式式存存储储,但但又又不不宜宜移移动动元元素素位位置置的的,则则可可通通过过建建立立一一个个指指示示各各个个数数据据元元素素存存储储位位置置的的辅辅助助表表来来实现实现n按内部排序过程中所需的工作量来区分
7、按内部排序过程中所需的工作量来区分:简单的排序方法,其时间复杂度为简单的排序方法,其时间复杂度为O(n2)先进的排序方法,其时间复杂度为先进的排序方法,其时间复杂度为O(nlogn)基数排序,其时间复杂度为基数排序,其时间复杂度为O(dn)6待排序的数据元素的类型定义如下:待排序的数据元素的类型定义如下:#define MAXSIZE 20#define MAXSIZE 20 /顺序表的最大长度顺序表的最大长度typedef int KeyType;/typedef int KeyType;/定义关键字类型为整数类型定义关键字类型为整数类型typedef struct typedef stru
8、ct KeyType key;KeyType key;/关键字关键字 char *otherinfo;char *otherinfo;/其它数据项其它数据项ElemType;ElemType;/数据元素类型数据元素类型typedef struct typedef struct ElemType*elem;ElemType*elem;/数据元素基地址数据元素基地址 int length;int length;/数据元素个数数据元素个数 int listsize;/int listsize;/存储空间大小存储空间大小SqList;SqList;/顺序表类型顺序表类型本章约定:7对于对于链式基数排序
9、,我们假定记录序列是基于链表存储的链式基数排序,我们假定记录序列是基于链表存储的。待排序的数据元素的类型定义为:待排序的数据元素的类型定义为:typedef structtypedef struct KeyType keysMAX_KEY_NUMKeyType keysMAX_KEY_NUM;/关键字字段关键字字段 char info40;char info40;/记录的其他信息记录的其他信息 int nextint next;/指针字段指针字段NodeTypeNodeType;/表结点类型表结点类型typedef structtypedef struct NodeTypeNodeTyperM
10、AX_SPACErMAX_SPACE;/静态链表,静态链表,r0r0为头结点为头结点 int int keynumkeynum;/关键字个数关键字个数 int int lengthlength;/当前表中记录数当前表中记录数L_TBLL_TBL;/链表类型链表类型8n插入排序(Insertion SortInsertion Sort):假定记录序列中前面:假定记录序列中前面的一部分记录已经有序,把后面的一个记录插入已排序的一部分记录已经有序,把后面的一个记录插入已排序的有序子序列中去的有序子序列中去,使得插入这个记录之后使得插入这个记录之后,得到的仍然得到的仍然是有序序列是有序序列,从而逐步的
11、扩大有序子序列的长度从而逐步的扩大有序子序列的长度,直到所直到所有记录都有序为止。有记录都有序为止。n假定记录序列的前面假定记录序列的前面i-1i-1个记录已经有序个记录已经有序,从无序序列从无序序列中取第中取第i i个记录个记录,将它插入到前面将它插入到前面i-1i-1个有序子序列中并个有序子序列中并且保持有序状态。且保持有序状态。如图如图所示。所示。8.8.2 2 插入排序插入排序n按照不同的查找插入位置和按照不同的查找插入位置和记录移动方法,插入排序可以记录移动方法,插入排序可以分为以下几类:直接插入排序、分为以下几类:直接插入排序、折半插入排序、希尔排序、折半插入排序、希尔排序、2-2
12、-路插入排序、表插入等路插入排序、表插入等.9n直接插入排序思路:直接插入排序思路:第第1 1趟将初始序列中的记录趟将初始序列中的记录R R1 1看做有序子序列,若看做有序子序列,若R R2 2的关键字的关键字小于小于R R1 1的关键字,则的关键字,则R R2 2插在插在R R1 1的前面,否则的前面,否则R R2 2插在插在R R1 1的后面。的后面。第第2 2趟将趟将R R3 3插入前面的两个记录的有序子序列中,得到插入前面的两个记录的有序子序列中,得到3 3个记个记录的有序子文件。录的有序子文件。以此类推,继续进行下去,直到将以此类推,继续进行下去,直到将R Rn n插入前面的插入前面
13、的n n1 1个记录个记录的有序子序列中,最后得到的有序子序列中,最后得到n n个记录的有序文件。个记录的有序文件。n具体实现时,在记录具体实现时,在记录R R1 1的前面增设记录的前面增设记录R R0 0,它既是中间变量,又,它既是中间变量,又是监视哨是监视哨:设设(R(R1 1,R R2 2,R Ri i1 1)是已排序的有序子序列,则插入是已排序的有序子序列,则插入R Ri i的的步骤是:首先将步骤是:首先将R Ri i存放到存放到R R0 0中,然后将中,然后将K K0 0(即原即原R Ri i的关键字的关键字K Ki i)依次与依次与K Ki i1 1,K Ki i2 2,比较,若比
14、较,若K K0 0KKj j(j=i(j=i1 1,i i2 2,1)1),则,则R Rj j后移一个位置,否则停止比较和移动,最后,将后移一个位置,否则停止比较和移动,最后,将R R0 0(即即原来待插入的记录原来待插入的记录R Ri i)移到移到j+1j+1的位置上。由于的位置上。由于R Ri i的前面有监视的前面有监视哨哨R R0 0,因此,因此不必每次判断下标不必每次判断下标j j是否出界是否出界 一、直接插入排序(Straight Insertion Sort)10n例:例:4242,2121,8989,1515,4343,28 28 排序过程为:排序过程为:k0 k1 k2 k3
15、k4 k5 k6k0 k1 k2 k3 k4 k5 k6初始关键字初始关键字:42 21 89 15 43 28 42 21 89 15 43 28 第一趟开始前第一趟开始前:(42)(42)21 89 15 43 2821 89 15 43 28第一趟排序后第一趟排序后:21:21 (2121 42)89 15 43 28 42)89 15 43 28 第二趟排序后第二趟排序后:89 (21 42:89 (21 42 8989)15 43 28)15 43 28 第三趟排序后第三趟排序后:15 (:15 (1515 21 42 89)43 28 21 42 89)43 28 第四趟排序后第四
16、趟排序后:43:43 (15 21 42 (15 21 42 4343 89)89)28 28 第五趟排序后第五趟排序后:28 (15 21 :28 (15 21 2828 42 43 89)42 43 89)11void InsertionSort(SqList&L)void InsertionSort(SqList&L)for(i=2;i=L.length;i+)for(i=2;i=L.length;i+)if(L.elemi.keyL.elemi-1.key)if(L.elemi.keyL.elemi-1.key)L.elem0=L.elemi;/L.elem0=L.elemi;/复制为
17、监视哨复制为监视哨 for(j=i-1;L.elem0.keyL.elemj.key;j-)for(j=i-1;L.elem0.keyL.elemj.key;j-)L.elemj+1=L.elemj;/L.elemj+1=L.elemj;/记录后移记录后移 L.elemj+1=L.elem0;/L.elemj+1=L.elem0;/插入到正确位置插入到正确位置 效率分析:效率分析:1)1)空间空间:仅用了一个辅助单元。空间复杂度为仅用了一个辅助单元。空间复杂度为O(1)O(1)2)2)时时间间:n-1n-1趟趟.比比较较的的次次数数和和移移动动记记录录的的次次数数取取决决于于待待排排序序列列按
18、按关键字的初始排列。关键字的初始排列。(最好、最坏、平均最好、最坏、平均)若待排序记录是随机的若待排序记录是随机的,则可取上述最小值和最大值的平均值则可取上述最小值和最大值的平均值,作为直接作为直接插入排序时所需进行关键字间的比较次数和移动记录的次数插入排序时所需进行关键字间的比较次数和移动记录的次数,约为约为n n2 2/4/4。由此由此,直接插入排序的时间复杂度为直接插入排序的时间复杂度为O(nO(n2 2)。3)3)稳定性:稳定稳定性:稳定直接插入排序算法实现如下:12用折半查找的方法找到插入位置用折半查找的方法找到插入位置例:在序列例:在序列13,27,35,48,65,7213,27
19、,35,48,65,72中插入中插入2020或或6060void BInsertSort(SqList&L)void BInsertSort(SqList&L)/对顺序表对顺序表L L做折半插入排序做折半插入排序 for(i=2;i=L.length;+i)for(i=2;i=L.length;+i)L.r0=L.ri;L.r0=L.ri;/将将L.riL.ri暂存到暂存到L.r0L.r0 low=1;hight=i-1;low=1;hight=i-1;while(lowhight)/while(low=hight+1;-j)for(j=i-1;j=hight+1;-j)L.rj+1=L.rj
20、;/L.rj+1=L.rj;/记录后移记录后移 L.rhight+1=L.r0;L.rhight+1=L.r0;/插入到正确位置插入到正确位置 /for/for/BInsertSort/BInsertSort二、折半插入排序 13折半插入排序效率分析:折半插入排序效率分析:1)1)空间效率:仅用了一个辅助单元。空间复杂度为空间效率:仅用了一个辅助单元。空间复杂度为O(1)O(1)。2)2)时间效率:确定插入位置所进行的折半查找,关键时间效率:确定插入位置所进行的折半查找,关键字的比较次数至多为字的比较次数至多为loglog2 2n+1n+1次,移动记录的次数和次,移动记录的次数和直接插入排序相
21、同,故时间复杂度仍为直接插入排序相同,故时间复杂度仍为O(nO(n2 2)。3)3)稳定性:折半插入排序是一个稳定的排序方法。稳定性:折半插入排序是一个稳定的排序方法。14n希希尔尔排排序序又又称称为为缩缩小小增增量量排排序序。是是对对直直接接插插入入排排序序的的一种改进一种改进,其方法:其方法:按按增增量量序序列列将将整整个个待待排排记记录录分分割割成成若若干干个个序序列列,分分别别进进行行直直接接插插入入排排序序,等等整整个个序序列列基基本本有有序序后后再再对对全全体体记记录录进进行行一一次次直接插入排序直接插入排序当原序列基本有序当原序列基本有序,即序列中满足以下特性的记录较少时即序列中
22、满足以下特性的记录较少时 直接插入排序的效率可大大提高直接插入排序的效率可大大提高;同时当同时当n很小时效率也较高很小时效率也较高,希尔排序正是从这两点分析出发对直接排序进行的改进。希尔排序正是从这两点分析出发对直接排序进行的改进。n例:例:假设待排序列为假设待排序列为3939,8080,7676,4141,1313,2929,5050,7878,3030,1111,100100,7 7,4141,8686。分别取步长因子。分别取步长因子5 5、3 3、1 1,则排序过,则排序过程如下程如下:三、希尔排序15初始序列:初始序列:39 80 76 41 13 29 50 78 30 11 100
23、 7 39 80 76 41 13 29 50 78 30 11 100 7 41 8641 86d=5d=5排序后:排序后:2 29 7 9 7 41 30 11 39 50 76 41 13 100 80 78 8641 30 11 39 50 76 41 13 100 80 78 86第一趟第一趟d=3d=3排序后:排序后:13 7 13 7 39 29 11 41 30 76 41 50 86 80 78 10039 29 11 41 30 76 41 50 86 80 78 100第二趟第二趟d=1d=1排序后:排序后:7 11 13 29 30 39 41 41 50 76 78
24、80 86 1007 11 13 29 30 39 41 41 50 76 78 80 86 100第三趟(即直接插入排序)第三趟(即直接插入排序)16希尔排序算法描述如下:1)1)选择一个步长序列选择一个步长序列t t1 1,t t2 2,t tk k,其中,其中t ti ittj j,t tk k=1=1;2)2)按步长序列个数按步长序列个数k k,对序列进行,对序列进行k k趟排序;趟排序;3)3)每趟排序,根据对应的步长每趟排序,根据对应的步长t ti i,将待排序列分割成,将待排序列分割成t ti i个长个长度为度为m m的子序列,分别对各子序列进行直接插入排序。例如,的子序列,分别
25、对各子序列进行直接插入排序。例如,步长为步长为d d时,将时,将 n n 个记录分成个记录分成 d d 个子序列:个子序列:R R1 1,R R1+d1+d,R R1+2d1+2d,R R1+kd1+kd R R2 2,R R2+d2+d,R R2+2d2+2d,R R2+kd2+kd R Rd d,R R2d2d,R R3d3d,R Rkdkd,R R(k+1)d(k+1)d其中,其中,d d称为增量,它的值在排序过程中从大到小逐渐缩小,称为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为直至最后一趟排序减为1 1。17void ShellInsert(SqList&L,int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 第八章 排序 第八
限制150内