数据结构(c语言版)课件_第八章_排序_(严蔚敏、吴伟民编_清华大学出版社)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第八章排序排序定义——将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列叫~排序分类按待排序记录所在位置内部排序:待排序记录存放在内存外部排序:排序过程中需对外存进行访问的排序按排序依据原则插入排序:直接插入排序、折半插入排序、希尔排序交换排序:冒泡排序、快速排序选择排序:简单选择排序、堆排序归并排序:2-路归并排序基数排序按排序所需工作量简单的排序方法:T(n)=O(n²)先进的排序方法:T(n)=O(logn)基数排序:T(n)=O(d.n)排序基本操作比较两个关键字大小将记录从一个位置移动到另一个位置8.1插入排序直接插入排序排序过程:整个排序过程为n-1趟插入,即先将序列中第1个记录看成是一个有序子序列,然后从第2个记录开始,逐个进行插入,直至整个序列有序算法描述例49386597761327i=238(3849)6597761327i=365(384965)97761327i=497(38496597)761327i=576(3849657697)1327i=613(133849657697)27i=1()i=7(133849657697)2727jjjjjj977665493827(13273849657697)排序结果:算法评价时间复杂度若待排序记录按关键字从小到大排列(正序)关键字比较次数:112nni记录移动次数:)1(222nni若待排序记录按关键字从大到小排列(逆序)关键字比较次数:2)1)(2(2nnini记录移动次数:2)1)(4()1(2nnini若待排序记录是随机的,取平均值关键字比较次数:42n记录移动次数:42nT(n)=O(n²)空间复杂度:S(n)=O(1)Ch8_1.c折半插入排序排序过程:用折半查找方法确定插入位置的排序叫~例i=1(30)1370853942620i=213(1330)70853942620i=76(6133039427085)20…...i=820(6133039427085)20sjmi=820(6133039427085)20sjmi=820(6133039427085)20sjmi=820(6133039427085)20sji=820(613203039427085)算法描述算法评价时间复杂度:T(n)=O(n²)空间复杂度:S(n)=O(1)Ch8_2.c希尔排序(缩小增量法)排序过程:先取一个正整数d1n,把所有相隔d1的记录放一组,组内进行直接插入排序;然后取d2d1,重复上述分组和排序操作;直至di=1,即所有记录放进一个组中排序为止取d3=1三趟分组:1327485544938659776三趟排序:4132738484955657697例初始:4938659776132748554一趟排序:1327485544938659776二趟排序:1344838274955659776取d1=5一趟分组:4938659776132748554取d2=3二趟分组:1327485544938659776算法描述Ch8_3.c例4938659776132748554#defineT3intd[]={5,3,1};ji49133827一趟排序:1327485544938659776jiji274jiji55ji38jijiji二趟排序:1344838274955659776jiji6548ji9755ji764希尔排序特点子序列的构成不是简单的“逐段分割”,而是将相隔某个增量的记录组成一个子序列希尔排序可提高排序速度,因为分组后n值减小,n²更小,而T(n)=O(n²),所以T(n)从总体上看是减小了关键字较小的记录跳跃式前移,在进行最后一趟增量为1的插入排序时,序列已基本有序增量序列取法无除1以外的公因子最后一个增量值必须为18.2交换排序冒泡排序排序过程将第一个记录的关键字与第二个记录的关键字进行比较,若为逆序r[1].keyr[2].key,则交换;然后比较第二个记录与第三个记录;依次类推,直至第n-1个记录和第n个记录比较为止——第一趟冒泡排序,结果关键字最大的记录被安置在最后一个记录上对前n-1个记录进行第二趟冒泡排序,结果使关键字次大的记录被安置在第n-1个记录位置重复上述过程,直到“在一趟排序过程中没有进行过交换记录的操作”为止例4938659776132730初始关键字3849657613273097第一趟38496513273076第二趟384913273065第三趟3813273049第四趟13273038第五趟132730第六趟38497697139727973097137676762730136527653065131349493049273827383038算法描述算法评价时间复杂度最好情况(正序)比较次数:n-1移动次数:0最坏情况(逆序)比较次数:)(21)(211nninni移动次数:)(23)(321nninni空间复杂度:S(n)=O(1)T(n)=O(n²)Ch8_4.c快速排序基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序排序过程:对r[s……t]中记录进行一趟快速排序,附设两个指针i和j,设枢轴记录rp=r[s],x=rp.key初始时令i=s,j=t首先从j所指位置向前搜索第一个关键字小于x的记录,并和rp交换再从i所指位置起向后搜索,找到第一个关键字大于x的记录,和rp交换重复上述两步,直至i==j为止再分别对两个子序列进行快速排序,直到每个子序列只含有一个记录为止例初始关键字:4938659776132750ijxji完成一趟排序:(273813)49(76976550)分别进行快速排序:(13)27(38)49(5065)76(97)快速排序结束:13273849506576974927ijijij4965ji1349ij4997ij算法描述算法评价时间复杂度最好情况(每次总是选到中间值作枢轴)T(n)=O(nlog2n)最坏情况(每次总是选到最小或最大元素作枢轴)T(n)=O(n²)空间复杂度:需栈空间以实现递归最坏情况:S(n)=O(n)一般情况:S(n)=O(log2n)T(n)=O(n²)Ch8_5.c8.3选择排序简单选择排序排序过程首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换重复上述操作,共进行n-1趟排序后,排序结束例初始:[49386597761327]kjjjjjjkki=11349一趟:13[386597764927]i=2kkjjjjj2738二趟:1327[6597764938]三趟:132738[97764965]四趟:13273849[769765]五趟:1327384965[9776]六趟:132738496576[97]排序结束:13273849657697算法描述算法评价时间复杂度记录移动次数最好情况:0最坏情况:3(n-1)比较次数:)(21)(211nninni空间复杂度:S(n)=O(1)T(n)=O(n²)Ch8_6.c堆排序堆的定义:n个元素的序列(k1,k2,……kn),当且仅当满足下列关系时,称之为堆或(i=1,2,…...n/2)kik2ikik2i+1kik2ikik2i+1例(96,83,27,38,11,9)例(13,38,27,50,76,65,49,97)962791138831327384965765097可将堆序列看成完全二叉树,则堆顶元素(完全二叉树的根)必为序列中n个元素的最小值或最大值堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫~堆排序需解决的两个问题:如何由一个无序序列建成一个堆?如何在输出堆顶元素之后,调整剩余元素,使之成为一个新的堆?第二个问题解决方法——筛选方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”例13273849657650979727384965765013输出:132749389765765013输出:139749382765765013输出:13273849502765769713输出:13276549502738769713输出:1327384965502738769713输出:1327387665502738499713输出:132738495065762738499713输出:132738499765762738495013输出:13273849506597762738495013输出:13273849509765762738495013输出:1327384950657665972738495013输出:1327384950659765762738495013输出:132738495065769765762738495013输出:1327384950657697算法描述第一个问题解决方法方法:从无序序列的第n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选例含8个元素的无序序列(49,38,65,97,76,13,27,50)49653827137697504965382713765097491338276576509749133827657650971327384965765097算法描述算法评价时间复杂度:最坏情况下T(n)=O(nlogn)空间复杂度:S(n)=O(1)Ch8_7.c8.4归并排序归并——将两个或两个以上的有序表组合成一个新的有序表,叫~2-路归并排序排序过程设初始序列含有n个记录,则可看成n个有序的子序列,每个子序列长度为1两两合并,得到n/2个长度为2或1的有序子序列再两两合并,……如此重复,直至得到一个长度为n的有序序列为止例初始关键字:[49][38][65][97][76][13][27]一趟归并后:[3849][6597][1376][27]二趟归并后:[38496597][132776]三趟归并后:[13273849657697]算法描述算法评价时间复杂度:T(n)=O(nlog2n)空间复杂度:S(n)=O(n)Ch8_9.c8.5基数排序多关键字排序定义:例对52张扑克牌按以下次序排序:23……A23……A23……A23……A两个关键字:花色()面值(23……A)并且“花色”地位高于“面值”多关键字排序方法最高位优先法(MSD):先对最高位关键字k1(如花色)排序,将序列分成若干子序列,每个子序列有相同的k1值;然后让每个子序列对次关键字k2(如面值)排序,又分成若干更小的子序列;依次重复,直至就每个子序列对最低位关键字kd排序;最后将所有子序列依次连接在一起成为一个有序序列最低位优先法(LSD):从最低位关键字kd起进行排序,然后再对高一位的关键字排序,……依次重复,直至对最高位关键字k1排序后,便成为一个有序序列MSD与LSD不同特点按MSD排序,必须将序列逐层分割成若干子序列,然后对各子序列分别排序按LSD排序,不必分成子序列,对每个关键字都是整个序

1 / 41
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功