数据结构分析学习教案_第1页
数据结构分析学习教案_第2页
数据结构分析学习教案_第3页
数据结构分析学习教案_第4页
数据结构分析学习教案_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、会计学1数据结构数据结构(sh j ji u)分析分析第一页,共105页。10.1 概述概述(i sh)10.2 插入排序插入排序10.3 快速快速(kui s)排序排序10.4 堆排序堆排序10.5 归并归并(gubng)排序排序10.6 基数排序基数排序10.7 各种排序方法的综合比较各种排序方法的综合比较10.8 外部排序外部排序第1页/共105页第二页,共105页。10.1 概概 述述一、排序一、排序(pi x)的定义的定义二、内部排序二、内部排序(pi x)和外部排序和外部排序(pi x)三、内部三、内部(nib)排序方法的分类排序方法的分类第2页/共105页第三页,共105页。一、

2、什么一、什么(shn me)是排序?是排序?排序是计算机内经常(jngchng)进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。例如:将下列(xili)关键字序列52, 49, 80, 36, 14, 58, 61, 23, 97, 75调整为14, 23, 36, 49, 52, 58, 61 ,75, 80, 97第3页/共105页第四页,共105页。 一般情况(qngkung)下,假设含n个记录的序列为 R1, R2, , Rn 其相应的关键字序列为 K1, K2, ,Kn 这些关键字相互之间可以(ky)进行比较,即在它们之间存在着这样一个关系 : Kp1Kp2

3、Kpn按此固有关系将上式记录序列重新排列为 Rp1, Rp2, ,Rpn 的操作(cozu)称作排序。第4页/共105页第五页,共105页。二、内部排序二、内部排序(pi x)和外部排序和外部排序(pi x)若整个(zhngg)排序过程不需要访问外存便能完成,则称此类排序问题为内部排序; 反之,若参加排序的记录数量很大, 整个序列的排序过程不可能在内存中 完成,则称此类排序问题(wnt)为外部排序。第5页/共105页第六页,共105页。三、内部排序三、内部排序(pi x)的方法的方法内部排序的过程是一个逐步扩大(kud)记录的有序序列长度的过程。经过经过(jnggu)一一趟排序趟排序有序序列区

4、无 序 序 列 区有序序列区无 序 序 列 区第6页/共105页第七页,共105页。基于不同的“扩大” 有序序列长度的方法,内部排序(pi x)方法大致可分下列几种类型:插入插入(ch r)类类交换交换(jiohun)类类选择类选择类 归并类归并类其它方法其它方法第7页/共105页第八页,共105页。待排记录的数据类型定义待排记录的数据类型定义(dngy)如下如下:#define MAXSIZE 1000 / 待排顺序待排顺序(shnx)表最大长度表最大长度typedef int KeyType; / 关键字类型关键字类型(lixng)为整数类型为整数类型(lixng)typedef stru

5、ct KeyType key; / 关键字项关键字项 InfoType otherinfo; / 其它数据项其它数据项 RcdType; / 记录类型记录类型typedef struct RcdType rMAXSIZE+1; / r0闲置闲置 int length; / 顺序表长度顺序表长度 SqList; / 顺序表类型顺序表类型第8页/共105页第九页,共105页。1. 插入插入(ch r)类类将无序子序列中的一个或几个记录“插入”到有序序列中,从而(cng r)增加记录的有序子序列的长度。第9页/共105页第十页,共105页。2. 交换交换(jiohun)类类通过“交换”无序序列中的记

6、录从而得到其中关键字最小或最大的记录,并将它加入(jir)到有序子序列中,以此方法增加记录的有序子序列的长度。第10页/共105页第十一页,共105页。3. 选择选择(xunz)类类从记录的无序(w x)子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。第11页/共105页第十二页,共105页。4. 归并归并(gubng)类类通过“归并”两个(lin )或两个(lin )以上的记录有序子序列,逐步增加记录有序序列的长度。5. 其它其它(qt)方法方法第12页/共105页第十三页,共105页。 10. 2 插插 入入 排排 序序第13页/共10

7、5页第十四页,共105页。有序序列(xli)R1.i-1Ri无序(w x)序列 Ri.n一趟直接(zhji)插入排序的基本思想:有序序列R1.i无序序列 Ri+1.n第14页/共105页第十五页,共105页。实现实现(shxin)“一趟插入排序一趟插入排序”可分三步进行:可分三步进行:3将将Ri 插入插入(ch r)(复制复制)到到Rj+1的的位置上。位置上。2将将Rj+1.i-1中的所有记录均后移中的所有记录均后移 一个一个(y )位置;位置;1在R1.i-1中查找查找Ri的插入位置, R1.j.key Ri.key Rj+1.i-1.key;第15页/共105页第十六页,共105页。直接插

8、入排序(基于顺序直接插入排序(基于顺序(shnx)查找)查找)表插入排序(基于表插入排序(基于(jy)链表存储)链表存储)不同不同(b tn)的具体实现方法导致不同的具体实现方法导致不同(b tn)的算法描述的算法描述折半插入排序折半插入排序(基于折半查找)(基于折半查找)希尔排序希尔排序(基于逐趟缩小增量)(基于逐趟缩小增量)第16页/共105页第十七页,共105页。一、直接一、直接(zhji)插插入排序入排序利用(lyng) “顺序查找”实现“在R1.i-1中查找Ri的插入位置”算法的实现算法的实现(shxin)要点:要点:第17页/共105页第十八页,共105页。从Ri-1起向前(xin

9、 qin)进行顺序查找, 监视哨设置在R0;R0 = Ri; / 设置(shzh)“哨兵”循环结束表明Ri的插入(ch r)位置为 j +1R0jRifor (j=i-1; R0.keyRj.key; -j); / 从后往前找j=i-1插入位置插入位置第18页/共105页第十九页,共105页。 对于在查找过程中找到的那些关键字不小于Ri.key的记录,并在查找的同时(tngsh)实现记录向后移动;for (j=i-1; R0.keyRj.key; -j); Rj+1 = RjR0jRij= i-1上述循环结束后可以直接(zhji)进行“插入”插入插入(ch r)位置位置第19页/共105页第二

10、十页,共105页。令 i = 2,3,, n, 实现整个序列(xli)的排序。for ( i=2; i=n; +i ) if (Ri.keyRi-1.key) 在在 R1.i-1中查找中查找Ri的插入的插入(ch r)位置位置; 插入插入(ch r)Ri ; 第20页/共105页第二十一页,共105页。void InsertionSort ( SqList &L ) / 对顺序对顺序(shnx)表表 L 作直接插入排序。作直接插入排序。 for ( i=2; i=L.length; +i ) if (L.ri.key L.ri-1.key) / InsertSortL.r0 = L.r

11、i; / 复制为监视哨for ( j=i-1; L.r0.key L.rj.key; - j ) L.rj+1 = L.rj; / 记录后移L.rj+1 = L.r0; / 插入到正确(zhngqu)位置第21页/共105页第二十二页,共105页。内部(nib)排序的时间分析:实现内部排序(pi x)的基本操作有两个:(2)“移动(ydng)”记录。(1)“比较比较”序列中两个关键字的 大小;第22页/共105页第二十三页,共105页。对于(duy)直接插入排序:最好的情况(关键字在记录序列最好的情况(关键字在记录序列(xli)中顺序有序):中顺序有序):“比较(bjio)”的次数:最坏的情况

12、(关键字在记录序列中逆序有序):最坏的情况(关键字在记录序列中逆序有序):“比较”的次数:112nni02) 1)(4() 1(2nnini“移动”的次数:“移动”的次数:2) 1)(4() 1(2nnini第23页/共105页第二十四页,共105页。 二、希尔排序二、希尔排序(pi x)(又称缩小增量排序(又称缩小增量排序(pi x)) 基本(jbn)思想:对待排记录序列先作“宏观”调整,再作“微观”调整。 所谓“宏观(hnggun)”调整,指的是,“跳跃式”的插入排序。 具体做法为:第24页/共105页第二十五页,共105页。将记录序列(xli)分成若干子序列(xli),分别对每个子序列(

13、xli)进行插入排序。其中,d 称为增量,它的值在排序过程中从大到小逐渐缩小(suxio),直至最后一趟排序减为 1。例如(lr):将 n 个记录分成 d 个子序列: R1,R1+d,R1+2d,R1+kd R2,R2+d,R2+2d,R2+kd Rd,R2d,R3d,Rkd,R(k+1)d 第25页/共105页第二十六页,共105页。例如(lr):16 25 12 30 47 11 23 36 9 18 31 第一趟希尔排序(pi x),设增量 d =511 23 12 9 18 16 25 36 30 47 31 第二趟希尔排序(pi x),设增量 d = 39 18 12 11 23 1

14、6 25 31 30 47 36第三趟希尔排序,设增量 d = 1 9 11 12 16 18 23 25 30 31 36 47 第26页/共105页第二十七页,共105页。void ShellInsert ( SqList &L, int dk ) for ( i=dk+1; i=n; +i ) if ( L.ri.key0&(L.r0.keyL.rj.key); j-=dk) L.rj+dk = L.rj; / 记录后移,查找记录后移,查找(ch zho)插入位置插入位置 L.rj+dk = L.r0; / 插入插入 / if / ShellInsert第27页/共105

15、页第二十八页,共105页。void ShellSort (SqList &L, int dlta, int t) / 增量增量(zn lin)为为dlta的希尔排序的希尔排序 for (k=0; k1) / while / BubbleSorti = n;i = lastExchangeIndex; / 本趟进行过交换的 / 最后一个记录(jl)的位置 if (Rj+1.key Rj.key) Swap(Rj, Rj+1); lastExchangeIndex = j; /记下(j xi)进行交换的记录位置 /iffor (j = 1; j i; j+)lastExchangeInde

16、x = 1;第31页/共105页第三十二页,共105页。注意注意(zh (zh y):y):2. 一般情况下,每经过一趟“起泡”,“i 减一”,但并不是(b shi)每趟都如此。例如例如(lr):52319782553157989i=7i=6for (j = 1; j i; j+) if (Rj+1.key Rj.key) 13i=21. 起泡排序的结束条件为, 最后一趟没有进行最后一趟没有进行“交换记录交换记录”。第32页/共105页第三十三页,共105页。时间时间(shjin)(shjin)分析分析: :最好的情况(关键字在记录最好的情况(关键字在记录(jl)序列中顺序有序):序列中顺序有

17、序): 只需进行一趟起泡只需进行一趟起泡“比较比较(bjio)”的次数:的次数:最坏的情况(关键字在记录序列中逆序有序):最坏的情况(关键字在记录序列中逆序有序): 需进行需进行n-1趟起泡趟起泡“比较比较”的次数:的次数:0“移动移动”的次数:的次数:“移动移动”的次数:的次数:n-12) 1() 1(2nnini2) 1(3) 1(32nnini第33页/共105页第三十四页,共105页。二、一趟快速二、一趟快速(kui s)排序(一次划分)排序(一次划分)目标:找一个记录,以它的关键字作为目标:找一个记录,以它的关键字作为“枢轴枢轴”,凡其关键字小于枢轴的记录均,凡其关键字小于枢轴的记录

18、均移动移动(ydng)至该记录之前,反之,凡关至该记录之前,反之,凡关键字大于枢轴的记录均移动键字大于枢轴的记录均移动(ydng)至该至该记录之后。记录之后。致使(zhsh)一趟排序之后,记录的无序序列Rs.t将分割成两部分:Rs.i-1和Ri+1.t,且 Rj.key Ri.key Rj.key (sji-1) 枢轴 (i+1jt)。第34页/共105页第三十五页,共105页。52 49 80 36 14 58 61 97 23 75stlowhigh设设 Rs=52 为枢为枢轴轴(sh zhu) 将 Rhigh.key 和 枢轴的关键字进行(jnxng)比较,要求Rhigh.key 枢轴的

19、关键字 将 Rlow.key 和 枢轴的关键字进行比较(bjio),要求Rlow.key 枢轴的关键字high23low80high14low52例如例如R052lowhighhighhighlow第35页/共105页第三十六页,共105页。 可见,经过“一次划分” ,将关键字序列(xli) 52, 49, 80, 36, 14, 58, 61, 97, 23, 75 调整为: 23, 49, 14, 36, (52) 58, 61, 97, 80, 75 在调整过程中,设立了两个指针: low 和high,它们(t men)的初值分别为: s 和 t, 之后逐渐减小 high,增加 low,

20、并保证 Rhigh.key52,和 Rlow.key52,否则(fuz)进行记录的“交换”。第36页/共105页第三十七页,共105页。int Partition (RedType& R, int low, int high) pivotkey = Rlow.key; while (lowhigh) while (low=pivotkey) -high; RlowRhigh; while (lowhigh & Rlow.key=pivotkey) +low; RlowRhigh; return low; / 返回返回(fnhu)枢轴所在位置枢轴所在位置 / Partition第

21、37页/共105页第三十八页,共105页。int Partition (RedType R, int low, int high) / Partition R0 = Rlow; pivotkey = Rlow.key; / 枢轴(sh zhu) while (lowhigh) while(low=pivotkey) - high; / 从右向左搜索从右向左搜索(su su)Rlow = Rhigh;while (lowhigh & Rlow.key=pivotkey) + low; / 从左向右搜索从左向右搜索(su su)Rhigh = Rlow;Rlow = R0; return

22、low;第38页/共105页第三十九页,共105页。三、快速三、快速(kui s)排序排序 首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个(lin )子序列“递归”进行快速排序。无 序 的 记 录 序 列无序记录(jl)子序列(1)无序子序列(2)枢轴枢轴一次划分分别进行快速排序第39页/共105页第四十页,共105页。void QSort (RedType & R, int s, int t ) / 对记录序列对记录序列Rs.t进行进行(jnxng)快速排序快速排序 if (s t-1) / 长度大于长度大于1 / QSortpivotloc = Partition(R

23、, s, t); / 对 Rs.t 进行(jnxng)一次划分QSort(R, s, pivotloc-1); / 对低子序列(xli)递归排序,pivotloc是枢轴位置QSort(R, pivotloc+1, t); / 对高子序列递归排序第40页/共105页第四十一页,共105页。void QuickSort( SqList & L) / 对顺序表进行对顺序表进行(jnxng)快速排序快速排序 QSort(L.r, 1, L.length); / QuickSort 第一次调用函数 Qsort 时,待排序(pi x)记录序列的上、下界分别为 1 和 L.length。第41页/共

24、105页第四十二页,共105页。四、快速四、快速(kui s)排序的时间分析排序的时间分析假设一次划分所得枢轴位置 i=k,则对n 个记录进行(jnxng)快排所需时间:其中 Tpass(n)为对 n 个记录(jl)进行一次划分所需时间。 若待排序列中记录的关键字是随机分布的,则 k 取 1 至 n 中任意一值的可能性相同T(n) = Tpass(n) + T(k-1) + T(n-k)第42页/共105页第四十三页,共105页。nkavgavgavgknTkTnCnnT1)() 1(1)(设 Tavg(1)b则可得结果(ji gu):) 1ln() 1)(22()(nncbnTavg结论结论

25、: 快速快速(kui s)排序的时间复杂度为排序的时间复杂度为O(nlogn)由此可得快速排序(pi x)所需时间的平均值为:第43页/共105页第四十四页,共105页。 若待排记录的初始状态为按关键字有序时,若待排记录的初始状态为按关键字有序时,快速排序快速排序(pi x)将蜕化为起泡排序将蜕化为起泡排序(pi x),其时间复杂度为其时间复杂度为O(n2)。 为避免出现这种情况,需在进行一次划分之前(zhqin),进行“予处理”,即: 先对 R(s).key, R(t).key 和 R(s+t)/2. key,进行相互比较(bjio),然后取关键字为 “三者之中”的记录为枢轴记录。第44页/

26、共105页第四十五页,共105页。10.4 堆堆 排排 序序简简 单单 选选 择择 排排 序序堆堆 排排 序序第45页/共105页第四十六页,共105页。一、简单一、简单(jindn)选择排序选择排序假设排序过程中,待排记录(jl)序列的状态为:有序序列(xli)R1.i-1无序序列 Ri.n 第 i 趟简单选择排序从中选出关键字最小的记录有序序列R1.i无序序列 Ri+1.n第46页/共105页第四十七页,共105页。简单(jindn)选择排序的算法描述如下:void SelectSort (Elem R, int n ) / 对记录序列对记录序列R1.n作简单作简单(jindn)选择排序。

27、选择排序。 for (i=1; i0; -i ) HeapAdjust ( H.r, i, H.length ); / 建大顶堆for ( i=H.length; i1; -i ) H.r1H.ri; / 将堆顶记录将堆顶记录(jl)和当前未经排序子序列和当前未经排序子序列 / H.r1.i中最后一个记录中最后一个记录(jl)相互交换相互交换 HeapAdjust(H.r, 1, i-1); / 对对 H.r1 进行筛选进行筛选第52页/共105页第五十三页,共105页。如何如何(rh)“建堆建堆”?两个两个(lin )问题问题:如何如何(rh)“筛选筛选”?定义堆类型为定义堆类型为:type

28、def SqList HeapType; / 堆采用顺序表表示之第53页/共105页第五十四页,共105页。所谓“筛选(shixun)”指的是,对一棵左/右子树均为堆的完全二叉树,“调整”根结点使整个二叉树也成为一个堆。堆堆筛选筛选(shixun)第54页/共105页第五十五页,共105页。98814973556412362740例如例如(lr):是大顶堆是大顶堆12但在 98 和 12 进行(jnxng)互换之后,它就不是堆了,因此,需要对它进行(jnxng)“筛选”。98128173641298比较比较比较第55页/共105页第五十六页,共105页。void HeapAdjust (Rcd

29、Type &R, int s, int m) / 已知已知 Rs.m中记录的关键字除中记录的关键字除 Rs 之外之外均均 / 满足堆的特征,本函数自上而下调整满足堆的特征,本函数自上而下调整(tiozhng) Rs 的的 / 关键字,使关键字,使 Rs.m 也成为一个大顶堆也成为一个大顶堆 / HeapAdjustrc = Rs; / 暂存 Rs for ( j=2*s; j= Rj.key ) break; / 再作再作“根根”和和“子树根子树根”之间的比之间的比较较(bjio) / 若若“=”成立,则说明已找到成立,则说明已找到 rc 的插的插 / 入位置入位置 s ,不需要继续往

30、下调,不需要继续往下调整整Rs = Rj; s = j; / 否则记录否则记录(jl)上移,尚需继续往下调整上移,尚需继续往下调整if ( jm & Rj.keyRj+1.key ) +j; / 左左/右右“子树根子树根”之间先进行相互比较之间先进行相互比较 / 令令 j 指示关键字较大记录指示关键字较大记录(jl)的位的位置置第57页/共105页第五十八页,共105页。建堆是一个建堆是一个(y )从下往上进行从下往上进行“筛选筛选”的过程。的过程。40554973816436122798例如例如: 排序之前排序之前(zhqin)的关键字序列为的关键字序列为12368173499881

31、7355 现在,左/右子树都已经调整(tiozhng)为堆,最后只要调整(tiozhng)根结点,使整个二叉树是个“堆”即可。98494064361227第58页/共105页第五十九页,共105页。堆排序的时间堆排序的时间(shjin)复杂度分析:复杂度分析:1. 对深度为对深度为 k 的堆,的堆,“筛选筛选”所需进行的关键字所需进行的关键字比较比较(bjio)的次数至多为的次数至多为2(k-1);3. 调整调整“堆顶堆顶” n-1 次,总共进行次,总共进行(jnxng)的关键的关键 字比较的次数不超过字比较的次数不超过 2 (log2(n-1)+ log2(n-2)+ +log22) 2n(

32、log2n) 因此,堆排序的时间复杂度为O(nlogn)。2. 对 n 个关键字,建成深度为h(=log2n+1)的堆,所需进行的关键字比较的次数至多 4n;第59页/共105页第六十页,共105页。10.5 归归 并并 排排 序序归并排序的过程基于下列基本(jbn)思想进行: 将两个或两个以上的有序子序列 “归并” 为一个有序序列。第60页/共105页第六十一页,共105页。在内部(nib)排序中,通常采用的是2-路归并排序。即:将两个位置相邻的记录有序子序列归并为一个记录(jl)的有序序列。有有 序序 序序 列列 Rl.n有序子序列有序子序列(xli) Rl.m有序子序列有序子序列 Rm+

33、1.n这个操作对顺序表而言,是轻而易举的。第61页/共105页第六十二页,共105页。void Merge (RcdType SR, RcdType &TR, int i, int m, int n) / 将有序的记录将有序的记录(jl)序列序列 SRi.m 和和 SRm+1.n / 归并为有序的记录归并为有序的记录(jl)序列序列 TRi.n / Mergefor (j=m+1, k=i; i=m & j=n; +k) / 将将SR中记录中记录(jl)由小到大地并入由小到大地并入TR if (SRi.key=SRj.key) TRk = SRi+; else TRk = SR

34、j+; 第62页/共105页第六十三页,共105页。if (i=m) TRk.n = SRi.m; / 将剩余将剩余(shngy)的的 SRi.m 复制到复制到 TRif (j=n) TRk.n = SRj.n; / 将剩余将剩余(shngy)的的 SRj.n 复制到复制到 TR第63页/共105页第六十四页,共105页。归并归并(gubng)排序的算法排序的算法如果记录无序序列 Rs.t 的两部分 Rs.(s+t)/2 和 R(s+t)/2+1.t分别按关键字有序,则利用上述归并算法很容易(rngy)将它们归并成整个记录序列是一个有序序列。 由此,应该先分别对这两部分进行(jnxng) 2-

35、路归并排序。第64页/共105页第六十五页,共105页。例如例如(lr):52, 23, 80, 36, 68, 14 (s=1, t=6) 52, 23, 80 36, 68, 14 52, 2380 52 23, 52 23, 52, 8036, 6814366836, 6814, 36, 68 14, 23, 36, 52, 68, 80 23第65页/共105页第六十六页,共105页。void Msort ( RcdType SR, RcdType &TR1, int s, int t ) / 将将SRs.t 归并归并(gubng)排序为排序为 TR1s.t if (s= =t

36、) TR1s=SRs; else / Msort 第66页/共105页第六十七页,共105页。m = (s+t)/2; / 将SRs.t平分为(fn wi)SRs.m和SRm+1.tMsort (SR, TR2, s, m); / 递归地将SRs.m归并(gubng)为有序的TR2s.mMsort (SR, TR2, m+1, t); /递归地SRm+1.t归并(gubng)为有序的TR2m+1.tMerge (TR2, TR1, s, m, t); / 将TR2s.m和TR2m+1.t归并到TR1s.t第67页/共105页第六十八页,共105页。void MergeSort (SqList

37、&L) / 对顺序对顺序(shnx)表表 L 作作2-路归并排序路归并排序 MSort(L.r, L.r, 1, L.length); / MergeSort容易看出,对 n 个记录进行归并(gubng)排序的时间复杂度为(nlogn)。即: 每一趟归并(gubng)的时间复杂度为 O(n), 总共需进行 log2n 趟。第68页/共105页第六十九页,共105页。10.6 基基 数数 排排 序序第69页/共105页第七十页,共105页。基数排序(pi x)是一种借助“多关键字排序(pi x)”的思想来实现“单关键字排序(pi x)”的内部排序(pi x)算法。多关键字的排序多关键字的

38、排序(pi x)链式基数排序链式基数排序第70页/共105页第七十一页,共105页。一、多关键字的排序一、多关键字的排序(pi x) n 个记录个记录(jl)的序列的序列 R1, R2, ,Rn对关键字对关键字 (Ki0, Ki1,Kid-1) 有序是指:有序是指: 其中其中(qzhng): K0 (qzhng): K0 被称为被称为 “ “最主最主”位关键字位关键字Kd-1 被称为被称为 “最次最次”位关键字位关键字 对于序列中任意两个记录 Ri 和 Rj(1ijn) 都满足满足下列(词典词典)有序有序关系: (Ki0, Ki1, , ,Kid-1) ) (Kj0, Kj1, , ,Kjd-

39、1) )第71页/共105页第七十二页,共105页。 实现(shxin)多关键字排序通常有两种作法:最低位优先最低位优先(yuxin)LSD(yuxin)LSD法法最高位优先最高位优先(yuxin)MSD(yuxin)MSD法法第72页/共105页第七十三页,共105页。先对先对K0K0进行排序,并按进行排序,并按 K0 K0 的不的不同值将记录序列分成若干子序列同值将记录序列分成若干子序列之后之后(zhhu)(zhhu),分别对,分别对 K1 K1 进行进行排序,排序,., 依次类推,直至依次类推,直至最后对最次位关键字排序完成为最后对最次位关键字排序完成为止。止。第73页/共105页第七十

40、四页,共105页。 先对 Kd-1 进行(jnxng)排序,然后对 Kd-2 进行(jnxng)排序,依次类推,直至对最主位关键字 K0 排序完成为止。 排序过程中不需要根据 “前一个” 关键字的排序结果,将记录序列(xli)分割成若干个(“前一个”关键字不同的)子序列(xli)。第74页/共105页第七十五页,共105页。例如例如: :学生记录学生记录(jl)(jl)含三个关键含三个关键字字: :系别、班号和班内的序列号,其中以系系别、班号和班内的序列号,其中以系别为最主位关键字。别为最主位关键字。 无序(w x)序列对对K2排序排序(pi x)对对K1排序排序对对K0排序排序3,2,301

41、,2,153,1,202,3,182,1,201,2,152,3,183,1,202,1,203,2,303,1,202,1,201,2,153,2,302,3,18 1,2,152,1,202,3,183,1,203,2,30LSD的排序过程如下:第75页/共105页第七十六页,共105页。二、链式基数排序二、链式基数排序假如多关键字的记录序列中,每个关键字的取值范围相同(xin tn),则按LSD法进行排序时,可以采用“分配-收集”的方法,其好处是不需要进行关键字间的比较。对于数字型或字符型的单关键字,可以看成是由多个数位或多个字符构成的多关键字,此时可以采用这种“分配-收集”的办法进行(

42、jnxng)排序,称作基数排序法。第76页/共105页第七十七页,共105页。例如例如(lr):对下列这组关键字:对下列这组关键字 209, 386, 768, 185, 247, 606, 230, 834, 539 首先按其 “个位数” 取值分别为 0, 1, , 9 “分配” 成 10 组,之后按从 0 至 9 的顺序(shnx)将 它们 “收集” 在一起; 然后按其 “十位数” 取值分别为 0, 1, , 9 “分配” 成 10 组,之后再按从 0 至 9 的顺序将它们 “收集(shuj)” 在一起;最后按其“百位数”重复一遍上述操作。第77页/共105页第七十八页,共105页。在计算

43、机上实现基数排序时,为减少所需辅助存储空间,应采用(ciyng)链表作存储结构,即链式基数排序,具体作法为: 待排序(pi x)记录以指针相链,构成一个链表;“分配分配” ” 时,按当前时,按当前“关键字位关键字位”所取所取值,将记录分配到不同的值,将记录分配到不同的 “ “链队列链队列(duli)” (duli)” 中,每个队列中,每个队列(duli)(duli)中记录的中记录的 “关键字位关键字位” ” 相同;相同;“收集”时,按当前关键字位取值从小到大将各队列首尾相链成一个链表;对每个关键字位均重复 2) 和 3) 两步。第78页/共105页第七十九页,共105页。例如(lr):p369

44、367167239237138230139进行进行(jnxng)第一次分配第一次分配进行进行(jnxng)第一次收集第一次收集f0 r0f7 r7f8 r8f9 r9p230230367 167237367167237 138368239139369 239139138第79页/共105页第八十页,共105页。进行进行(jnxng)第二次分配第二次分配p230237138239139p230367167237138368239139f3 r3f6 r6230 237138239139367 167368367167368进行(jnxng)第二次收集第80页/共105页第八十一页,共105页。

45、进行第三次收集之后便得到记录(jl)的有序序列f1 r1p230237138239139367167368进行进行(jnxng)第三次分配第三次分配f2 r2f3 r3138 139167230 237239367 368p138139167230237239367368第81页/共105页第八十二页,共105页。提醒提醒(t xng)注意:注意:“分配分配”和和“收集收集”的实际操作仅的实际操作仅为修改链表中的指针和设置为修改链表中的指针和设置(shzh)队队列的头、尾指针;列的头、尾指针;为查找使用,该链表尚需应用算法为查找使用,该链表尚需应用算法(sun f)Arrange 将它调整为有

46、序表。将它调整为有序表。第82页/共105页第八十三页,共105页。 基数排序的时间(shjin)复杂度为O(d(n+rd)其中(qzhng):分配为O(n) 收集为O(rd)(rd为“基”) d为“分配-收集”的趟数第83页/共105页第八十四页,共105页。10.7 各种排序方法的综合各种排序方法的综合(zngh)比较比较第84页/共105页第八十五页,共105页。一、时间一、时间(shjin)性能性能1. 平均的时间平均的时间(shjin)性能性能基数排序基数排序时间时间(shjin)复杂度为复杂度为 O(nlogn):快速排序、堆排序和归并排序快速排序、堆排序和归并排序时间复杂度为时间

47、复杂度为 O(n2):直接插入排序、起泡排序和直接插入排序、起泡排序和简单选择排序简单选择排序时间复杂度为时间复杂度为 O(n):第85页/共105页第八十六页,共105页。2. 当待排记录序列当待排记录序列(xli)按关键字顺序有按关键字顺序有序时序时3. 简单简单(jindn)选择排序、堆排序和归选择排序、堆排序和归并排序的时间性能不随记录序列中关键并排序的时间性能不随记录序列中关键字的分布而改变。字的分布而改变。 直接插入排序和起泡排序能达到(d do)O(n)的时间复杂度, 快速排序的时间性能蜕化为O(n2) 。第86页/共105页第八十七页,共105页。二、空间二、空间(kngjin

48、)性能性能指的是排序过程中所需的辅助空间(kngjin)大小1. 所有所有(suyu)的简单排序方法的简单排序方法(包括:包括:直接插入、直接插入、起泡和简单选择起泡和简单选择) 和堆排序的空间复杂度和堆排序的空间复杂度为为O(1);2. 快速排序为快速排序为O(logn),为递归程序执行过程中,栈所需的辅助空间;第87页/共105页第八十八页,共105页。3. 归并排序归并排序(pi x)所需辅助空间最所需辅助空间最多,其空间复杂度为多,其空间复杂度为 O(n);4. 链式基数排序需附设队列首尾指针链式基数排序需附设队列首尾指针(zhzhn),则空间复杂度为,则空间复杂度为 O(rd)。第8

49、8页/共105页第八十九页,共105页。三、排序三、排序(pi x)方法的稳定性能方法的稳定性能 1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置(wi zhi),在排序之前和经过排序之后,没有改变。 2. 当对多关键字的记录序列进行当对多关键字的记录序列进行LSD方方法法(fngf)排序时,必须采用稳定的排序排序时,必须采用稳定的排序方法方法(fngf)。排序之前 : Ri(K) Rj(K) 排序之后 : Ri(K) Rj(K) 第89页/共105页第九十页,共105页。例如例如(lr): 排序(pi x)前 ( 56, 34, 47, 23, 66, 18, 8

50、2, 47 )若排序后得到结果 ( 18, 23, 34, 47, 47, 56, 66, 82 )则称该排序方法(fngf)是稳定的;若排序后得到结果 ( 18, 23, 34, 47, 47, 56, 66, 82 )则称该排序方法是不稳定不稳定的。第90页/共105页第九十一页,共105页。 3. 对于对于(duy)不稳定的排序方法,只不稳定的排序方法,只要能举出一个实例说明即可。要能举出一个实例说明即可。 4. 快速排序快速排序(pi x)、堆排序、堆排序(pi x)和和希尔排序希尔排序(pi x)是不稳定的排序是不稳定的排序(pi x)方法。方法。例如例如 : 对对 4, 3, 4,

51、 2 进行进行(jnxng)快快速排序,速排序, 得到得到 2, 3, 4, 4 第91页/共105页第九十二页,共105页。四、关于四、关于“排序方法排序方法(fngf)的时间复杂度的时间复杂度的下限的下限” 本章讨论的各种排序方法,除基数排序外,其它方法都是基于“比较(bjio)关键字”进行排序的排序方法。 可以证明, 这类排序(pi x)法可能达到的最快的时间复杂度为O(nlogn)。 (基数排序(pi x)不是基于“比较关键字”的排序(pi x)方法,所以它不受这个限制。)第92页/共105页第九十三页,共105页。10.8外外 部部 排排 序序第93页/共105页第九十四页,共105

52、页。一一. 问题问题(wnt)的提出的提出 待排序的记录数量很大,不能待排序的记录数量很大,不能一次装入内存,则无法利用前几节一次装入内存,则无法利用前几节讨论的排序方法讨论的排序方法 (否则否则(fuz)将引将引起频繁访问内存起频繁访问内存);第94页/共105页第九十五页,共105页。 对外存中数据对外存中数据(shj)的读的读/写是以写是以“数据数据(shj)块块”为单位进行的;为单位进行的; 读读/写外存中一个写外存中一个“数据数据(shj)块块”的数的数据据(shj)所需要的时间为:所需要的时间为: TI/O = tseek + tla + n twm 其中其中 tseek 为寻查时间为寻查时间(查找该数据查找该数据(shj)块所在磁道块所在磁道) tla 为等待为等待(延迟延迟)时间时间 n twm 为传输数据为传输数据(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论