




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
排序试题汇总 一、填空题(每空1分,共24分)1. 大多数排序算法都有两个基本的操作: 比较(两个关键字的大小) 和 移动(记录或改变指向记录的指针) 。2. 在对一组记录(54,38,96,23,15,72,60,45,83)进行直接插入排序时,当把第7个记录60插入到有序表时,为寻找插入位置至少需比较 3 次。(可约定为,从后向前比较)3. 在插入和选择排序中,若初始数据基本正序,则选用 插入排序(到尾部) ;若初始数据基本反序,则选用 选择排序 。4. 在堆排序和快速排序中,若初始记录接近正序或反序,则选用 堆排序 ;若初始记录基本无序,则最好选用 快速排序 。5. 对于n个记录的集合进行冒泡排序,在最坏的情况下所需要的时间是 O(n2) 。若对其进行快速排序,在最坏的情况下所需要的时间是 O(n2) 。6. 对于n个记录的集合进行归并排序,所需要的平均时间是 O(nlog2n) ,所需要的附加空间是 O(n) 。7【计研题2000】对于n个记录的表进行2路归并排序,整个归并排序需进行 log2n 趟(遍),共计移动 n log2n 次记录。(即移动到新表中的总次数!共log2n趟,每趟都要移动n个元素)8.设要将序列(Q, H, C, Y, P, A, M, S, R, D, F, X)中的关键码按字母序的升序重新排列,则:冒泡排序一趟扫描的结果是 H, C, Q, P, A, M, S, R, D, F, X ,Y ;初始步长为4的希尔(shell)排序一趟的结果是 P, A, C, S, Q, D, F, X , R, H,M, Y ;二路归并排序一趟扫描的结果是 H, Q, C, Y,A, P, M, S, D, R, F, X ;快速排序一趟扫描的结果是 F, H, C, D, P, A, M, Q, R, S, Y,X ;堆排序初始建堆的结果是 A, D, C, R, F, Q, M, S, Y,P, H, X 。9. 在堆排序、快速排序和归并排序中,若只从存储空间考虑,则应首先选取 堆排序 方法,其次选取 快速排序 方法,最后选取 归并排序 方法;若只从排序结果的稳定性考虑,则应 选取归并排序方法;若只从平均情况下最快考虑,则应选取快速排序方法;若只从最坏情况下最快并且要节省内存考虑,则应选取堆排序方法。二、单项选择题(每小题1分,共18分)( C )1将5个不同的数据进行排序,至多需要比较 次。. 8 . 9 . 10 . 25( C )2 排序方法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进行比较,将其放入已排序序列的正确位置上的方法,称为. 希尔排序 . 冒泡排序 . 插入排序 . 选择排序( D )3 排序方法中,从未排序序列中挑选元素,并将其依次插入已排序序列(初始时为空)的一端的方法,称为. 希尔排序 . 归并排序 . 插入排序 . 选择排序( C )4对个不同的排序码进行冒泡排序,在下列哪种情况下比较的次数最多。. 从小到大排列好的 . 从大到小排列好的 . 元素无序 . 元素基本有序( D )5对个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数为. n+1 . n . n-1 . n(n-1)/2(前3个答案都太小了)( C )6快速排序在下列哪种情况下最易发挥其长处。. 被排序的数据中含有多个相同排序码 . 被排序的数据已基本有序. 被排序的数据完全无序 . 被排序的数据中的最大值和最小值相差悬殊( B )7 【计研题2001】对有n个记录的表作快速排序,在最坏情况下,算法的时间复杂度是AO(n) BO(n2) CO(nlog2n) DO(n3)( C )8若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为. 38, 40, 46, 56, 79, 84 . 40,38, 46 , 79, 56, 84 . 40, 38,46, 56, 79, 84 . 40, 38,46, 84, 56, 79( A&D )9【计研题2001】在最好情况下,下列排序算法中 排序算法所需比较关键字次数最少。A冒泡 B归并 C快速 D直接插入(仅n1次!)( C )10 【计研题2001】置换选择排序的功能是 。 (置换选择排序简单选择排序?)A选出最大的元素 B产生初始归并段 C产生有序文件 D置换某个记录( A )11将5个不同的数据进行排序,至少需要比较 次。. 4 . 5 . 6 . 7( D )12下列关键字序列中, 是堆。. 16,72,31,23,94,53 . 94,23, 31, 72, 16, 53 . 16, 53, 23,94,31, 72 . 16, 23, 53,31, 94, 72( B )13堆是一种 排序。. 插入 .选择 . 交换 . 归并( C )14堆的形状是一棵 . 二叉排序树 .满二叉树 . 完全二叉树 . 平衡二叉树( B )15若一组记录的排序码为(46, 79, 56, 38, 40, 84),则利用堆排序的方法建立的初始堆为. 79, 46, 56, 38, 40, 84 . 84, 79, 56, 38, 40, 46 . 84, 79, 56, 46, 40, 38 . 84, 56, 79, 40, 46, 38 ( B )16 下述几种排序方法中,平均查找长度(ASL)最小的是. 插入排序 .快速排序 . 归并排序 . 选择排序( C )17 下述几种排序方法中,要求内存最大的是. 插入排序 .快速排序 . 归并排序 . 选择排序( B )18目前以比较为基础的内部排序方法中,其比较次数与待排序的记录的初始排列状态无关的是. 插入排序 . 二分插入排序 . 快速排序 . 冒泡排序三、简答题(每小题4分,共36分)1. 【全国专升本题】已知序列基本有序,问对此序列最快的排序方法是多少,此时平均复杂度是多少?答:插入排序和冒泡应该是最快的。因为只有比较动作,无需移动元素。此时平均时间复杂度为O(n)2. 设有1000个无序的元素,希望用最快的速度挑选出其中前10个最大的元素,最好采用哪种排序方法?答:用堆排序或锦标赛排序最合适,因为不必等全部元素排完就能得到所需结果,时间效率为O(nlog2n);若用冒泡排序则需时n!/(n-10)!3. 用某种排序方法对线性表(25, 84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下:25, 84,21,47,15,27,68,35,20 20, 15, 21, 25,47, 27,68,35, 84 15, 20, 21, 25,35, 27, 47, 68, 8415, 20, 21, 25,27, 35, 47, 68, 84, 问采用的是什么排序方法?答:用的是快速排序方法。注意每一趟要振荡完全部元素才算一个中间结果。4. 对于整数序列100,99,98,3,2,1,如果将它完全倒过来,分别用冒泡排序和快速排序法,它们的比较次数和交换次数各是多少?答:冒泡排序的比较和交换次数将最大,都是1+2+n-1=n(n-1)/25099=4545次快速排序则看按什么数据来分子表。如果按100来分,则很惨,也会是n(n-1)/2!若按中间数据50或51来分表,则:第1轮能确定1个元素,即在1个子表中比较和交换了n1个元素;n(21-1)第2轮能再确定2个元素,即在2个子表中比较和交换了n3个元素;n(22-1)第3轮能再确定4个元素,即在4个子表中比较和交换了n7个元素;n(23-1)第4轮能再确定8个元素,即在8个子表中比较和交换了n15个元素;n(24-1)第6轮能再确定32个元素,即在32个子表中比较和交换了n65个元素;n(26-1)第7轮则能全部确定,(因为27=128), 在100个子表中比较和交换了n(1001)个元素; 比较和交换总次数为:7n(2112212312611001) 7n+7(12464+100)=7n(8+16+32+164)=700-220=480次若从中间选择初始元素,则ASL=(n+1)log2n(212223+2m)= nlog2n+log2n(212223+n)O(nlog2n)5.【全国专升本试题】【严题集10.15】设有n个值不同的元素存于顺序结构中,试问能否用比2n-3少的比较次数选出这n个元素中的最大值和最小值?若能请说明如何实现(不需写算法)。在最坏情况下至少需进行多少次比较。(或问:对含有n个互不相同元素的集合,同时找最大元和最小元至少需进行多少次比较?)答:若用冒泡排序法,求最大值需n-1次比较;第二趟改为从n-1开始求最小值,需n-2次比较,合计2n-3次。显然本题意图是放弃冒泡排序,寻找其他方法。法1 :一个简单的办法是,在一趟比较时,将头两个元素分别作为最大和最小值的暂存内容,将其余n-2个元素与其相比,具体可设计为:第1步:a1a2? YES则直接替换a2,NO则再比较a1, 12次;第3步:a4a2? YES则直接替换a2,NO则再比较a1, 12次;第n-1步:ana2? YES则直接替换a2,NO则再比较a1, 12次;合计:(n-2)(12)1=(n-1)(2n-3 )2n-3 最好情况至少需要n-1次比较,最坏情况需2n-3次。法2 :借用快速排序第一趟思想:以a1为支点,将序列分成两个子表。这一趟需要n-1次比较;然后,在左边的子表中求最小值,冒泡一趟需要y-1次;在右边的子表中求最大值,冒泡一趟需要z-1次;合计需要(n-1)+( y-1)+( z-1)=n+y+z-3 因为y+z+1=n, 所以总次数2n42n3!但最坏情况下仍为为2n-3次,即一趟完毕后仍为单子表的情况。怎么办?有无更好的办法?法3 :能否用锦标赛排序思路?求最大值等于求冠军,需要n1次比较;但接着求最小值,等于在n/2个叶子中比较即可。编程也不复杂:可设计为,第一趟:n个数据两两比较(共n/2次),小者放偶数位,大者放奇数位;第二趟:对奇数位元素继续两两比较(n/4次);对偶数位元素也两两比较(n/4次);合计n/2次;第三趟:对奇数位元素继续两两比较(n/23次);对偶数位元素也两两比较(n/23次);合计n/22次;第四趟:对奇数位元素继续两两比较(n/24次);对偶数位元素也两两比较(n/24次);合计n/23次;第log2n趟:对奇数位元素继续两两比较(n/2log2n次1);对偶数位元素也两两比较(1次);合计2次;全部比较次数为:2+4+8+n/2次2n-3 (n1) 用二进制性质即可证明? 因为 20+21+2k-2+2k-12k ,即21+2k-2+2k-12k 1 2k 1 +2k 2(n=2k, 当k1,即n=2时为极端情况,11; n=3时,1.53k=2时,即n=4时,2ai+1,则两者交换;第三趟对奇数i,第四趟对偶数i;依次类推直至整个序列有序为止。(1)试问这种排序方法的结束条件是什么?是否为稳定排序?(2)分析当初始序列为正序或逆序两种情况下,奇偶交换排序过程中所需进行的关键字比较的次数。 (3)分析此种排序方法的平均复杂度及最坏复杂度。答:(1) 这种算法其实是两两比较,第一趟很像锦标赛的“初赛”,将胜者(大数)置于偶数单元;第二趟对偶数单元操作,即第一组大者与第二组小者战,大者后移。结果相当于冒泡排序的一趟;所以结束条件应为偶数趟无交换。结束条件是:若n为偶数时,奇数循环时in-1 ,偶数循环时in ,若n为奇数时,奇数循环时in 偶数循环时in+1似乎不稳定?因为交换没有依次进行。四、【全国专升本类似题】【类严题集10.1】以关键字序列(256,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下算法的各趟排序结束时,关键字序列的状态,并说明这些排序方法中,哪些易于在链表(包括各种单、双、循环链表)上实现? 直接插入排序 希尔排序 冒泡排序 快速排序直接选择排序 堆排序 归并排序 基数排序 (8分)解:先回答第2问: 皆易于在链表上实现。 直接插入排序的中间过程如下: 希尔排序的中间过程如下: 冒泡排序的中间过程如下: 快速排序的中间过程如下:直接选择排序的中间过程如下: 堆排序(大根堆)的中间过程如下: 归并排序排序的中间过程如下: 基数排序的中间过程如下:五、算法设计题(4选2, 每题7分,共14分)1. 【严题集10.25】试编写教科书10.2.2节中所述链表插入排序的算法。10.25 void SLInsert_Sort(SLList &L)/静态链表的插入排序算法 L.r0.key=0;L.r0.next=1; L.r1.next=0; /建初始循环链表 for(i=2;i=L.length;i+) /逐个插入 p=0;x=L.ri.key; while(L.rL.rp.next.keyx&L.rp.next) p=L.rp.next; q=L.rp.next; L.rp.next=i; L.ri.next=q; /for p=L.r0.next; for(i=1;iL.length;i+) /重排记录的位置 while(pi) p=L.rp.next; q=L.rp.next; if(p!=i) L.rpL.ri; L.ri.next=p; p=q; /for /SLInsert_Sort 2.【严题集10.30】按下述原则编写快排的非递归算法:(1) 一趟排序之后,先对长度较短的子序列进行排序,且将另一子序列的上、下界入栈保存;(2) 若待排记录数3,则不再进行分割,而是直接进行比较排序。10.30 typedef struct int low; int high; boundary; /子序列的上下界类型 void QSort_NotRecurve(int SQList &L)/快速排序的非递归算法 low=1;high=L.length; InitStack(S); /S的元素为boundary类型 while(low2) /如果当前子序列长度大于3且尚未排好序 pivot=Partition(L,low,high); /进行一趟划分 if(high-pivotpivot-low) Push(S,pivot+1,high); /把长的子序列边界入栈 high=pivot-1; /短的子序列留待下次排序 else Push(S,low,pivot-1); low=pivot+1; /if else if(lowhigh&high-low3)/如果当前子序列长度小于3且尚未排好序 Easy_Sort(L,low,high); /直接进行比较排序 low=high; /当前子序列标志为已排好序 else /如果当前子序列已排好序但栈中还有未排序的子序列 Pop(S,a); /从栈中取出一个子序列 low=a.low; high=a.high; /while /QSort_NotRecurve int Partition(SQList &L,int low,int high)/一趟划分的算法,与书上相同 L.r0=L.rlow; pivotkey=L.rlow.key; while(lowhigh) while(low=pivotkey) high-; L.rlow=L.rhigh; while(lowhigh&L.rlow.keyL.rhigh.key) L.rlowL.rhigh; else /子序列含有三个元素 if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1; if(L.rlow+1.keyL.rhigh.key) L.rlow+1L.rhigh; if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1; /Easy_Sort 2.【严题集10.41】假设有1000个关键字为小于10000的整数的记录序列,请设计一种排序方法,要求以尽可能少的比较次数和移动次数实现排序,并按你的设计编出算法。解:可以用基数排序来实现,关键字位数d=4,数基radix=10(从09)则基数排序的算法如下;void Hash_Sort(int a )/对1000个关键字为四位整数的记录进行排序 int b10000; for(i=0;i1000;i+) /直接按关键字散列 (即分配) for(j=ai;bj;j=(j+1)%10000); bj=ai; for(i=0,j=0;i1000;j+) /将散列收回a中 if(bj) for(x=bj,k=j;bk;k=(k+1)%10000) if(bk=x) ai+=x; bk=0; /if /Hash_Sort 【严题集10.42】序列的“中值记录”指的是:如果将此序列排序后,它是第n/2个记录。试写一个求中值记录的算法。10.42 typedef struct int gt; /大于该记录的个数 int lt; /小于该记录的个数 place; /整个序列中比某个关键字大或小的记录个数 int Get_Mid(int a ,int n) /求一个序列的中值记录的位置 place bMAXSIZE; for(i=0;in;i+) /对每一个元素统计比它大和比它小的元素个数gt和lt for(j=0;jai) bi.gt+; else if(ajai) bi.lt+; mid=0; min_dif=abs(b0.gt-b0.lt); for(i=0;in;i+) /找出gt值与lt值最接近的元素,即为中值记录 if(abs(bi.gt-bi.lt)min_dif) mid=i; return mid; /Get_Mid 基本概念排序(Sorting)是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个项值有序的序列。作为排序依据的数据项称为“排序码”,也即数据元素的关键码。为了便于查找,通常希望计算机中的数据表是按关键码有序的。如有序表的折半查找,查找效率较高。还有,二叉排序树、B-树和B+树的构造过程就是一个排序过程。若关键码是主关键码,则对于任意待排序序列,经排序后得到的结果是唯一的;若关键码是次关键码,排序结果可能不唯一,这是因为具有相同关键码的数据元素,这些元素在排序结果中,它们之间的的位置关系与排序前不能保持。若对任意的数据元素序列,使用某个排序方法,对它按关键码进行排序:若相同关键码元素间的位置关系,排序前与排序后保持一致,称此排序方法是稳定的;而不能保持一致的排序方法则称为不稳定的。 排序分为两类:内排序和外排序。内排序:指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列。外排序:指排序过程中还需访问外存储器,足够大的元素序列,因不能完全放入内存,只能使用外排序。1.插入排序1.1直接插入排序设有n个记录,存放在数组r中,重新安排记录在数组中的存放顺序,使得按关键码有序。即r1.keyr2.keyrn.key 先来看看向有序表中插入一个记录的方法:设,r1.keyr2.keyrj-1.key,将rj插入,重新安排存放顺序,使得r1.keyr2.keyrj.key,得到新的有序表,记录数增。【算法1】 r0=rj; /rj送r0中,使rj为待插入记录空位i=j-1; /从第i个记录向前测试插入位置,用r0为辅助单元,可免去测试i1。若r0.keyri.key,转。 /插入位置确定若r0.key ri.key时,ri+1=ri;i=i-1;转。 /调整待插入位置 ri+1=r0;结束。 /存放待插入记录【例10.1】向有序表中插入一个记录的过程如下:r1 r2 r3 r4 r5 存储单元2 10 18 25 9 将r5插入四个记录的有序表中,j=5r0=rj;i=j-1;初始化,设置待插入位置2 10 18 25 ri+1为待插入位置i=4,r0 ri,ri+1=ri;i-;调整待插入位置2 10 18 25 i=3,r0 ri,ri+1=ri;i-;调整待插入位置2 10 18 25 i=2,r0 ri,ri+1=ri;i-;调整待插入位置2 10 18 25 i=1,r0 ri,ri+1=r0;插入位置确定,向空位填入插入记录2 9 10 18 25 向有序表中插入一个记录的过程结束直接插入排序方法:仅有一个记录的表总是有序的,因此,对n个记录的表,可从第二个记录开始直到第n个记录,逐个向有序表中进行插入操作,从而得到n个记录按关键码有序的表。【算法2】void InsertSort(S_TBL &p) for(i=2;ilength;i+)if(p-elemi.key elemi-1.key) /*小于时,需将elemi插入有序表*/ p-elem0.key=p-elemi.key; /*为统一算法设置监测*/for(j=i-1;p-elem0.key elemj.key;j-)p-elemj+1.key=p-elemj.key; /*记录后移*/p-elemj+1.key=p-elem0.key; /*插入到正确位置*/【效率分析】空间效率:仅用了一个辅助单元。时间效率:向有序表中逐个插入记录的操作,进行了n-1趟,每趟操作分为比较关键码和移动记录,而比较的次数和移动记录的次数取决于待排序列按关键码的初始排列。最好情况下:即待排序列已按关键码有序,每趟操作只需1次比较2次移动。总比较次数=n-1次总移动次数=2(n-1)次最坏情况下:即第j趟操作,插入记录需要同前面的j个记录进行j次关键码比较,移动记录的次数为j+2次。平均情况下:即第j趟操作,插入记录大约同前面的j/2个记录进行关键码比较,移动记录的次数为j/2+2次。由此,直接插入排序的时间复杂度为O(n2)。是一个稳定的排序方法。1.2折半插入排序直接插入排序的基本操作是向有序表中插入一个记录,插入位置的确定通过对有序表中记录按关键码逐个比较得到的。平均情况下总比较次数约为n2/4。既然是在有序表中确定插入位置,可以不断二分有序表来确定插入位置,即一次比较,通过待插入记录与有序表居中的记录按关键码比较,将有序表一分为二,下次比较在其中一个有序子表中进行,将子表又一分为二。这样继续下去,直到要比较的子表中只有一个记录时,比较一次便确定了插入位置。二分判定有序表插入位置方法: low=1;high=j-1;r0=rj; / 有序表长度为j-1,第j个记录为待插入记录/设置有序表区间,待插入记录送辅助单元若lowhigh,得到插入位置,转 lowhigh,m=(low+high)/2; / 取表的中点,并将表一分为二,确定待插入区间*/若r0.keyrm.key,high=m-1; /插入位置在低半区否则,low=m+1; / 插入位置在高半区转 high+1即为待插入位置,从j-1到high+1的记录,逐个后移,rhigh+1=r0;放置待插入记录。【算法3】void InsertSort(S_TBL *s) /* 对顺序表s作折半插入排序 */for(i=2;ilength;i+) s-elem0=s-elemi; /* 保存待插入元素 */low=i;high=i-1; /* 设置初始区间 */while(lowelem0.keys-elemmid.key)low=mid+1; /* 插入位置在高半区中 */else high=mid-1; /* 插入位置在低半区中 */* while */for(j=i-1;j=high+1;j-) /* high+1为插入位置 */s-elemj+1=s-elemj; /* 后移元素,留出插入空位 */s-elemhigh+1=s-elem0; /* 将元素插入 */* for */* InsertSort */【时间效率】确定插入位置所进行的折半查找,关键码的比较次数至多为 ,次,移动记录的次数和直接插入排序相同,故时间复杂度仍为O(n2)。是一个稳定的排序方法。1.3表插入排序直接插入排序、折半插入排序均要大量移动记录,时间开销大。若要不移动记录完成排序,需要改变存储结构,进行表插入排序。所谓表插入排序,就是通过链接指针,按关键码的大小,实现从小到大的链接过程,为此需增设一个指针项。操作方法与直接插入排序类似,所不同的是直接插入排序要移动记录,而表插入排序是修改链接指针。用静态链表来说明。#define SIZE 200typedef structElemType elem; /*元素类型*/int next; /*指针项*/NodeType; /*表结点类型*/typedef structNodeType rSIZE; /*静态链表*/int length; /*表长度*/L_TBL; /*静态链表类型*/假设数据元素已存储在链表中,且0号单元作为头结点,不移动记录而只是改变链指针域,将记录按关键码建为一个有序链表。首先,设置空的循环链表,即头结点指针域置0,并在头结点数据域中存放比所有记录关键码都大的整数。接下来,逐个结点向链表中插入即可。【例1】表插入排序示例 MAXINT 49 38 65 97 76 13 27 490 - - - - - - - -MAXINT 49 38 65 97 76 13 27 491 0 - - - - - - -MAXINT 49 38 65 97 76 13 27 492 0 1 - - - - - -MAXINT 49 38 65 97 76 13 27 492 3 1 0 - - - - -MAXINT 49 38 65 97 76 13 27 492 3 1 4 0 - - - -MAXINT 49 38 65 97 76 13 27 492 3 1 5 0 4 - - -MAXINT 49 38 65 97 76 13 27 496 3 1 5 0 4 2 - -MAXINT 49 38 65 97 76 13 27 496 3 1 5 0 4 7 2 -MAXINT 49 38 65 97 76 13 27 496 8 1 5 0 4 7 2 3【算法4】1. j=l-r0.next;i=1; /指向第一个记录位置,从第一个记录开始调整2. 若i=l-length时,调整结束;否则,a. 若i=j,j=l-rj.next;i+;转(2) /数据元素应在这分量中,不用调整,处理下一个结点b. 若ji,l-ri.eleml-rj.elem; /交换数据元素p=l-rj.next; / 保存下一个结点地址l-rj.next=l-i.next;l-i.next=j; / 保持后续链表不被中断j=p;i+;转(2) / 指向下一个处理的结点c. 若ji,while(jrj.next;/j分量中原记录已移走,沿j的指针域找寻原记录的位置转到(a)【例2】对表插入排序结果进行重排示例 MAXINT 49 38 65 97 76 13 27 496 8 1 5 0 4 7 2 3MAXINT 13 38 65 97 76 49 27 496 (6) 1 5 0 4 8 2 3MAXINT 13 27 65 97 76 49 38 496 (6) (7) 5 0 4 8 1 3MAXINT 13 27 38 97 76 49 65 496 (6) (7) (7) 0 4 8 5 3MAXINT 13 27 38 49 76 97 65 496 (6) (7) (7) (6) 4 0 5 3MAXINT 13 27 38 49 49 97 65 766 (6) (7) (7) (6) (8) 0 5 4MAXINT 13 27 38 49 49 65 97 766 (6) (7) (7) (6) (8) (7) 0 4MAXINT 13 27 38 49 49 65 76 976 (6) (7) (7) (6) (8) (7) (8) 0【时效分析】表插入排序的基本操作是将一个记录插入到已排好序的有序链表中,设有序表长度为i,则需要比较至多i+1次,修改指针两次。因此,总比较次数与直接插入排序相同,修改指针总次数为2n次。所以,时间复杂度仍为O(n2)1.4希尔排序(Shells Sort)希尔排序又称缩小增量排序,是1959年由D.L.Shell提出来的,较前述几种插入排序方法有较大的改进。直接插入排序算法简单,在n值较小时,效率比较高,在n值很大时,若序列按关键码基本有序,效率依然较高,其时间效率可提高到O(n)。希尔排序即是从这两点出发,给出插入排序的改进方法。希尔排序方法:1. 选择一个步长序列t1,t2,tk,其中titj,tk=1;2. 按步长序列个数k,对序列进行k趟排序;3. 每趟排序,根据对应的步长ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。仅步长因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。【例4】待排序列为 39,80,76,41,13,29,50,78,30,11,100,7,41,86。步长因子分别取5、3、1,则排序过程如下:p=5 39 80 76 41 13 29 50 78 30 11 100 7 41 86子序列分别为39,29,100,80,50,7,76,78,41,41,30,86,13,11。第一趟排序结果:p=3 29 7 41 30 11 39 50 76 41 13 100 80 78 86子序列分别为29,30,50,13,78,7,11,76,100,86,41,39,41,80。第二趟排序结果:p=1 13 7 39 29 11 41 30 76 41 50 86 80 78 100此时,序列基本“有序”,对其进行直接插入排序,得到最终结果:7 11 13 29 30 39 41 41 50 76 78 80 86 100【算法5】void ShellInsert(S_TBL &p,int dk) /*一趟增量为dk的插入排序,dk为步长因子*/for(i=dk+1;ilength;i+)if(p-elemi.key elemi-dk.key) /*小于时,需elemi将插入有序表*/ p-elem0=p-elemi; /*为统一算法设置监测*/for(j=i-dk;j0&p-elem0.key elemj.key;j=j-dk)p-elemj+dk=p-elemj; /*记录后移*/p-elemj+dk=p-elem0; /*插入到正确位置*/void ShellSort(S_TBL *p,int dlta,int t) /*按增量序列dlta0,1,t-1对顺序表*p作希尔排序*/for(k=0;kt;t+)ShellSort(p,dltak); /*一趟增量为dltak的插入排序*/【时效分析】希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于步长因子序列的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的步长因子序列的方法。步长因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:步长因子中除1外没有公因子,且最后一个步长因子必须为1。希尔排序方法是一个不稳定的排序方法。2 交换排序交换排序主要是通过两两比较待排记录的关键码,若发生与排序要求相逆,则交换之。2.1冒泡排序(Bubble Sort)先来
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化学人教版选修5第三章 烃的含氧衍生物第四节 有机合成教学设计1
- 2024-2025学年高中语文 第4单元 12 飞向太空的航程说课稿 新人教版必修1
- 中医药技术培训考试题及答案
- 中医考试题及答案解析
- 2024年泉州2024年道路旅客运输从业资格证模拟试题
- 商务考察用车无偿租给企业使用合同范本
- 酒店式公寓店面产权转让与酒店式管理服务合同
- 人工智能商业数据分析资源授权与智能决策协议
- 个人旅游贷款合同展期与旅游服务保障协议
- 2025企业员工合同终止证明
- 蛋白质分离纯化及鉴定
- 2024年化粪池清理合同协议书范本
- 实用美术基础中职全套教学课件
- 债权债务法律知识讲座
- 南京财经大学《812西方经济学(宏观经济学、微观经济学)》历年考研真题及详解
- 基于教育培训行业的客户关系营销研究
- 肉制品工艺学-香肠类制品-课件
- 超全QC管理流程图
- 2广告实务课程标准
- 001 比较思想政治教育(第二版) 第一章
- GB/T 2992.1-2011耐火砖形状尺寸第1部分:通用砖
评论
0/150
提交评论