数据结构c语言5.pptx
《数据结构c语言5.pptx》由会员分享,可在线阅读,更多相关《数据结构c语言5.pptx(92页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 排排序序是是指指将将一一组组数数据据元元素素按按某某个个数数据据项项值值的的大大小小排排列列成成一个有序序列的过程。一个有序序列的过程。排排序序是是计计算算机机程程序序设设计计中中经经常常使使用用的的一一种种重重要要操操作作,是是组织数据和处理数据的最基本最重要的运算之一。组织数据和处理数据的最基本最重要的运算之一。排排序序被被广广泛泛应应用用于于数数据据处处理理、情情报报检检索索、商商业业金金融融等等许许多领域。多领域。第1页/共92页9.6 分配排序(基数排序)分配排序(基数排序)第2页/共92页1 1记录、关键码和排序表:记录、关键码和排序表:记录:数据元素 关键码(或排序码):作为排
2、序依据的数据项称为数据元素的关键码。排序表:若干个(n个)排序纪录组成的集合。排序表也称成为文件,主要操作是排序。2 2非递减序列、递减序列、非递增序列、递增有序非递减序列、递减序列、非递增序列、递增有序3 3稳定排序和非稳定排序稳定排序和非稳定排序 稳定排序稳定排序 :记录的相对位置在排序前后不发生变化:记录的相对位置在排序前后不发生变化 不稳定排序:不稳定排序:第3页/共92页4 4内部排序和外部排序内部排序和外部排序 待排序的表完全放在内存中待排序的表完全放在内存中称为称为内排序内排序5 5对排序方法的评价对排序方法的评价空间性能:除排序表以外的内存占用情况。空间性能:除排序表以外的内存
3、占用情况。时间性能:时间性能:比较关键码的次数比较关键码的次数,数据移动的次数数据移动的次数。它们往往是排序表规模(它们往往是排序表规模(n n)的函数)的函数第4页/共92页6.6.记录和排序表的数据结构记录和排序表的数据结构 在本章的讨论中,除特殊声明外,一般采用在本章的讨论中,除特殊声明外,一般采用顺序结构顺序结构存存储排序表。储排序表。记录和排序表的类型定义如下:记录和排序表的类型定义如下:#define MAXNUM#define MAXNUM /*MAXNUM /*MAXNUM 为足够大的数为足够大的数*/typedef struct typedef struct keytype
4、key;keytype key;/*/*关键码字段关键码字段*/*/*其它信息其它信息*/datatypedatatype;/*/*记录类型记录类型 RecNode*/RecNode*/datatype RMAXNUM;datatype RMAXNUM;/*/*定义排序表定义排序表的存的存储储*/如不加特别说明,排序表中的记录如不加特别说明,排序表中的记录R1R1RnRn存放在存放在R1R1RnRn分量中,分量中,R0R0分量闲置或做监视哨分量闲置或做监视哨(n n是排序是排序表中记录的个数)。表中记录的个数)。第5页/共92页9.6 分配排序(基数排序)分配排序(基数排序)第6页/共92页
5、1 1 直接插入排序直接插入排序 2 2 折半插入排序折半插入排序 3 *3 *表插入排序表插入排序 3 3 希尔排序希尔排序 插入排序的基本思想是:每次将一个待排序的记录,插入排序的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子表的适当位按其关键字大小插入到前面已经排好序的子表的适当位置,直到全部记录插入完成,整个表有序为止。置,直到全部记录插入完成,整个表有序为止。第7页/共92页9.2.1 9.2.1 直接插入排序直接插入排序 直直接接插插入入排排序序是是一一种种简简单单的的插插入入排排序序方方法法,基基本本思思想想为为:在在R1R1至至Ri-1Ri-1长长度
6、度为为i-1i-1的的子子表表已已经经有有序序的的情情况况下下,将将RiRi插插入入,得得到到R1R1至至RiRi长长度度为为i i 的的子子表表有有序序,这这样样通通过过n-1n-1趟趟(i=2.ni=2.n)之之后后,R1R1至至RnRn有序。有序。第8页/共92页例如例如,对于以下序列(为简便起见,对于以下序列(为简便起见,每一个记录只列出其排每一个记录只列出其排序码序码,用排序码代表记录):,用排序码代表记录):10 18 20 36 60 25 30 18 12 56 10 18 20 36 60 25 30 18 12 56 其中,前其中,前5 5个记录组成的子序列是有序的,这时要
7、将第个记录组成的子序列是有序的,这时要将第6 6个记录插入到前个记录插入到前5 5个记录组成的有序子序列中去,得到一个含个记录组成的有序子序列中去,得到一个含有有6 6个记录的新有序序列。完成这个插入首先需要找到插入位个记录的新有序序列。完成这个插入首先需要找到插入位置:置:202536202536,因此,因此2525应插入到记录应插入到记录2020和记录和记录3636之间,从而之间,从而得到以下新序列:得到以下新序列:10 18 20 25 36 60 30 18 12 56 10 18 20 25 36 60 30 18 12 56 这就是一趟直接插入排序的过程。这就是一趟直接插入排序的过
8、程。直直接接插插入入排排序序:仅仅有有一一个个记记录录的的表表总总是是有有序序的的,因因此此,对对n n个个记记录录的的表表,可可从从第第二二个个记记录录开开始始直直到到第第n n个个记记录录,逐逐个个向向有有序序表表中中进进行行插插入入操操作,从而得到作,从而得到n n个记录按关键码有序的表。个记录按关键码有序的表。第9页/共92页 R0R1R2R3R4R5R6R7R8R9R10初始:36201810602530181256i=2:(20)(2036)1810602530181256i=3:(18)(182036)10602530181256i=4:(10)(10182036)6025301
9、81256i=7:(30)(10182025303660)181256i=8:(18)(1018182025303660)1256第10页/共92页【算法算法9-19-1】直接插入排序直接插入排序void D_InsertSort(datatypeD_InsertSort(datatype R,int n)/*对排序表R1.Rn进行直接插入排序,n是记录的个数*/for(i=2;i=n;i+)if(Ri.keyRi-1.key)R0=Ri;/*将Ri插入R1.Ri-1中,R0为监测哨*/for(j=i-1;R0.keyRj.key;j-)Rj+1=Rj;/*后移记录*/Rj+1=R0;/*插入
10、到合适位置*/第11页/共92页性能分析性能分析 空间性能空间性能:仅用了一个辅助单元:仅用了一个辅助单元R0R0作为监视哨,空间复作为监视哨,空间复杂度为杂度为O(1)O(1)。时间性能时间性能:向有序表中逐个插入记录的操作,进行了:向有序表中逐个插入记录的操作,进行了n n 1 1趟,每趟操作分为趟,每趟操作分为比较比较关键码和关键码和移动移动记录,而比较的次数和移记录,而比较的次数和移动记录的次数取决于初始序列的排列情况动记录的次数取决于初始序列的排列情况 。分三种情况讨论:。分三种情况讨论:第12页/共92页总比较次数总比较次数总移动次数总移动次数(2)(2)最坏情况下最坏情况下:即第
11、即第j j趟操作,插入记录需要同前面的趟操作,插入记录需要同前面的j j个记录进行个记录进行j j次次关键码比较,移动记录的次数为关键码比较,移动记录的次数为j+2j+2次。次。(1)(1)最好情况下最好情况下:即待排序列已按关键码有序,每趟操作只需即待排序列已按关键码有序,每趟操作只需1 1次比较,次比较,0 0次移动。即:次移动。即:总比较次数=n-1次 总移动次数=0次第13页/共92页(3)(3)平均情况下:平均情况下:即第即第j j趟操作,插入记录大约同前面的趟操作,插入记录大约同前面的j/2j/2个记录进行关键个记录进行关键码比较,移动记录的次数为码比较,移动记录的次数为j/2+2
12、j/2+2次。次。总比较次数总比较次数总移动次数总移动次数 由此,直接插入排序的时间复杂度为O(n2)。直接插入排序是一个稳定的排序方法。直接插入排序也可以在链式结构上实现。第14页/共92页9.2.2 9.2.2 折半插入排序折半插入排序直直接接插插入入排排序序的的基基本本操操作作是是向向有有序序表表中中插插入入一一个个记记录录,在在直直接接插插入入排排序序中中,插插入入位位置置的的确确定定是是通通过过对对有有序序表表中中关关键键码码的顺序比较得到的。的顺序比较得到的。既既然然是是在在有有序序表表中中确确定定插插入入位位置置,因因此此在在寻寻找找RiRi的的插插入入位位置置时时,就就可可以以
13、采采用用折折半半查查找找的的方方法法,用用折折半半查查找找方方法法查查找找RiRi的的插插入入位位置置,再再将将RiRi插插入入进进去去,使使得得RiRi到到RiRi有有序序,这种方法就是折半插入排序。这种方法就是折半插入排序。第15页/共92页【算法9-2】折半插入排序算法折半插入排序算法void B_InsertSort(datatype R,int n)/*对排序表R1.Rn作折半插入排序,n是记录的个数*/for(i=2;i=n;i+)R0=Ri;/*保存待插入元素*/low=1;high=i1;/*设置初始区间*/while(lowRmid.key)low=mid+1;/*插入位置在
14、高半区中*/else high=mid-1;/*插入位置在低半区中*/for(j=i-1;j=high+1;j-)/*high+1为插入位置*/Rj+1=Rj;/*后移元素,留出插入空位*/Rhigh+1=R0;/*将元素插入*/第16页/共92页时间效率时间效率 确定插入位置所进行的折半查找,定位一个关键码的位置需要比较次数至多为 次,所以比较次数时间复杂度为O(nlog2n)。相对直接插入排序,折半插入排序只能减少关键字间的比较次数,而移动记录的次数和直接插入排序相同,故时间复杂度仍为O(n2)。折半插入排序是一个稳定的排序方法。折半插入排序只适合于顺序存储的排序表。折半插入排序只适合于顺
15、序存储的排序表。第17页/共92页9.2.3 9.2.3 希尔排序希尔排序又又称称为为“缩缩小小增增量量排排序序”。是是19591959年年由由D.L.ShellD.L.Shell提提出出来来的的 基本思想:先选取一个小于先选取一个小于n n的整数的整数didi(称之为(称之为步长步长),),然后把排序表中的然后把排序表中的n n个记录分为个记录分为didi个组,从第一个记录开始,个组,从第一个记录开始,间隔为间隔为didi的记录为同一组的记录为同一组,各组内进行直接插入排序,一趟,各组内进行直接插入排序,一趟之后,间隔之后,间隔didi的记录有序,随着有序性的改善,减小步长的记录有序,随着有
16、序性的改善,减小步长didi(排序子表变大),重复进行,(排序子表变大),重复进行,直到直到di=1di=1(全部记录成为(全部记录成为一个排序表),使得间隔为一个排序表),使得间隔为1 1的记录有序,也就使整体达到了的记录有序,也就使整体达到了有序。有序。步长为步长为1 1时就是前面讲的直接插入排序。时就是前面讲的直接插入排序。第18页/共92页例:例:排序列表为:39,80,76,41,13,29,50,78,30,11,100,7,41,86 步长因子分别取5、3、1,则排序过程如下:3980764113295078301110074186P=5间隔为5的子序列分别为:39,29,100
17、,80,50,7,76,78,41,41,30,86,13,11。第19页/共92页第一趟排序结果,使得间隔为第一趟排序结果,使得间隔为5 5的字表有序:的字表有序:2974130113950764113100807886P=3子序列分别为子序列分别为:29,30,50,13,78:29,30,50,13,78,7,11,76,100,867,11,76,100,86,41,39,41,8041,39,41,80。第二趟排序结果:第二趟排序结果:1373929114130764150868078100P=1此此时时,序序列列“基基本本有有序序”,对对其其进进行行直直接接插插入入排排序序,得得到
18、到最最终结果:终结果:7111329303941415076788086100第20页/共92页【算法9-4】希尔排序的算法希尔排序的算法void ShellSort(datatype R,int n,int d,int t)/*按增量序列d0,d1 dt 1对排序表R1.Rn进行希尔排序*/int i,j,k,h;for(k=0;kt;k+)h=dk;/*本趟的增量*/for(i=h+1;i=n;i+)if(Ri.key0&R0.keyRj.key;j=j h)Rj+h=Rj;/*记录后移*/Rj+h=R0;/*插入到正确位置*/第21页/共92页时效分析时效分析 希希尔尔排排序序时时效效分
19、分析析很很难难,关关键键码码的的比比较较次次数数与与记记录录移移动动次次数数依依赖赖于于步步长长因因子子序序列列的的选选取取,特特定定情情况况下下可可以以准准确确估估算算出出关关键键码码的的比比较较次次数数和和记记录录的的移移动动次次数数。目目前前还还没没有有人人给给出出选选取取最最好的步长因子序列的方法。好的步长因子序列的方法。步步长长因因子子序序列列可可以以有有各各种种取取法法,有有取取奇奇数数的的,也也有有取取质质数数的的,但但需需要要注注意意:步步长长因因子子中中除除1 1外外没没有有公公因因子子,且且最最后后一一个个步长因子必须为步长因子必须为1 1。希尔排序方法是一个希尔排序方法是
20、一个不稳定不稳定的排序方法。的排序方法。第22页/共92页9.6 分配排序(基数排序)分配排序(基数排序)第23页/共92页 交交换换排排序序的的基基本本思思想想是是:通通过过排排序序表表中中两两个个记记录录关关键键码码的的比比较较,若若与与排排序序要要求求相相逆逆,则则将将二二者者进进行行交交换换,直直至至没有反序的记录为止。没有反序的记录为止。交交换换排排序序的的特特点点是是:排排序序码码值值较较小小记记录录的的向向序序列列的的一一端移动,排序码值较大记录的向序列的另一端移动。端移动,排序码值较大记录的向序列的另一端移动。9.3.1 9.3.1 冒泡排序冒泡排序9.3.2 9.3.2 快速
21、排序快速排序第24页/共92页9.3.1 9.3.1 冒泡排序冒泡排序 设排序表为设排序表为R1.RnR1.Rn,对,对n n个记录的排序表进行冒泡排序个记录的排序表进行冒泡排序(Bubble Sort)(Bubble Sort)的过程是:的过程是:第第1 1趟,从第趟,从第1 1个记录开始到第个记录开始到第n n个记录,对个记录,对n n 1 1对对相邻的两相邻的两个个记录关键字进行比较,若与排序要求相逆,则将二者交换。记录关键字进行比较,若与排序要求相逆,则将二者交换。一趟之后,具有最大关键字的记录交换到了一趟之后,具有最大关键字的记录交换到了RnRn,第第2 2趟,从第趟,从第1 1个记
22、录开始到第个记录开始到第n n 1 1个记录继续进行第二趟冒个记录继续进行第二趟冒泡。泡。两趟之后,具有次最大关键字的记录交换到了两趟之后,具有次最大关键字的记录交换到了RnRn 11,如此重复,如此重复,n n 1 1趟后,在趟后,在R1.RnR1.Rn中,中,n n个记录按关键码有个记录按关键码有序。序。冒泡排序最多进行冒泡排序最多进行 n n 1 1趟,趟,在某趟的两两比较过程中,如果在某趟的两两比较过程中,如果一次交换都未发生,表明已经有序,一次交换都未发生,表明已经有序,则排序提前结束。则排序提前结束。第25页/共92页【算法9-5】冒泡排序算法冒泡排序算法 void Bubble_
23、Sort(datetype R,int n)/*对排序表R1.Rn进行冒泡排序,n是记录个数*/int i,j;int swap;/*交换标志变量*/for(i=1;in1;i+)swap=0;for(j=1;jRj+1.key)R0=Rj+1;Rj=Rj+1;Rj+1=R0;swap=1;/*置交换标志*/if(swap=0)break;第26页/共92页效率分析效率分析空间效率:仅用了一个辅助单元。时间效率:总共要进行n-1趟冒泡,对j个记录的表进行一趟冒泡需要j-1次关键码比较。总比较次数总比较次数移动次数:最好情况下:待排序列已有序,不需移动。最坏情况下:每次比较后均要进行三次移动。移
24、动次数移动次数第27页/共92页9.3.2 9.3.2 快速排序快速排序1 1、快速排序的思想、快速排序的思想 快速排序是通过比较关键码、交换记录,以以某某个个记记录录为为界界(该该记记录录称称为为支支点点,通通常常取取第第一一个个元元素素),将将待待排排序序列列分分成成两两部部分分。其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码。我们将待排序列按关键码以支点记录分成两部分的过程,称为一次(趟)划分划分。对各部分不断划分,直到每一步分只剩一个元素,整个序列则按关键码有序。第28页/共92页2 2、一次划分示例、一次划分示例【例9-5】对排序表
25、:49,14,38,74,96,65,8,49,55,27进行划分。划分过程如图9-5所示。设初始状态:49 14 38 74 96 65 8 49 55 27 14 38 74 96 65 8 49 55 27 low high从high向前搜索小于49的记录,找到后将其调整到low位置,得到结果:27 14 38 74 96 65 8 49 55 low high从low向后搜索大于49的记录,找到后将其调整到high位置,得到结果:27 14 38 96 65 8 49 55 74 low high 第29页/共92页再从high向前搜索小于49的记录,找到后将其调整到low位置,得到结
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言
限制150内