数据结构分析学习教案.pptx
《数据结构分析学习教案.pptx》由会员分享,可在线阅读,更多相关《数据结构分析学习教案.pptx(105页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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)进行比较,即在它们之间存在着这样一个关系:Kp1Kp2Kpn按此固有关系将上式记录序列重新排列为 Rp1,
3、Rp2,,Rpn 的操作(cozu)称作排序。第4页/共105页第五页,共105页。二、内部排序二、内部排序(pi x)和外部排序和外部排序(pi x)若整个(zhngg)排序过程不需要访问外存便能完成,则称此类排序问题为内部排序;反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中 完成,则称此类排序问题(wnt)为外部排序。第5页/共105页第六页,共105页。三、内部排序三、内部排序(pi x)的方法的方法内部排序的过程是一个逐步扩大(kud)记录的有序序列长度的过程。经过经过(jnggu)一一趟排序趟排序有序序列区无 序 序 列 区有序序列区无 序 序 列 区第6页/共10
4、5页第七页,共105页。基于不同的“扩大”有序序列长度的方法,内部排序(pi x)方法大致可分下列几种类型:插入插入(ch r)类类交换交换(jiohun)类类选择类选择类 归并类归并类其它方法其它方法第7页/共105页第八页,共105页。待排记录的数据类型定义待排记录的数据类型定义(dngy)如下如下:#define MAXSIZE 1000/待排顺序待排顺序(shnx)表最大长度表最大长度typedef int KeyType;/关键字类型关键字类型(lixng)为整数类型为整数类型(lixng)typedef struct KeyType key;/关键字项关键字项 InfoType o
5、therinfo;/其它数据项其它数据项 RcdType;/记录类型记录类型typedef struct RcdType rMAXSIZE+1;/r0闲置闲置 int length;/顺序表长度顺序表长度 SqList;/顺序表类型顺序表类型第8页/共105页第九页,共105页。1.插入插入(ch r)类类将无序子序列中的一个或几个记录“插入”到有序序列中,从而(cng r)增加记录的有序子序列的长度。第9页/共105页第十页,共105页。2.交换交换(jiohun)类类通过“交换”无序序列中的记录从而得到其中关键字最小或最大的记录,并将它加入(jir)到有序子序列中,以此方法增加记录的有序子
6、序列的长度。第10页/共105页第十一页,共105页。3.选择选择(xunz)类类从记录的无序(w x)子序列中“选择”关键字最小或最大的记录,并将它加入到有序子序列中,以此方法增加记录的有序子序列的长度。第11页/共105页第十二页,共105页。4.归并归并(gubng)类类通过“归并”两个(lin)或两个(lin)以上的记录有序子序列,逐步增加记录有序序列的长度。5.其它其它(qt)方法方法第12页/共105页第十三页,共105页。10.2 插插 入入 排排 序序第13页/共105页第十四页,共105页。有序序列(xli)R1.i-1Ri无序(w x)序列 Ri.n一趟直接(zhji)插入
7、排序的基本思想:有序序列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页。直接插入排序(基于顺序直接插入排序(基于顺序(shnx)查找)查找)表插入排序(基于表插入排序(基于(jy)链表存储)链表
8、存储)不同不同(b tn)的具体实现方法导致不同的具体实现方法导致不同(b tn)的算法描述的算法描述折半插入排序折半插入排序(基于折半查找)(基于折半查找)希尔排序希尔排序(基于逐趟缩小增量)(基于逐趟缩小增量)第16页/共105页第十七页,共105页。一、直接一、直接(zhji)插入排序插入排序利用(lyng)“顺序查找”实现“在R1.i-1中查找Ri的插入位置”算法的实现算法的实现(shxin)要点:要点:第17页/共105页第十八页,共105页。从Ri-1起向前(xin qin)进行顺序查找,监视哨设置在R0;R0=Ri;/设置(shzh)“哨兵”循环结束表明Ri的插入(ch r)位置
9、为 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页第二十页,共105页。令 i=2,3,,n,实现整个序列(xli)的排序。for(i=2;i=n;+i)if(Ri.keyRi-1.key)在在 R1.i-1中
10、查找中查找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.ri;/复制为监视哨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)排
11、序的时间分析:实现内部排序(pi x)的基本操作有两个:(2)“移动(ydng)”记录。(1)“比较比较”序列中两个关键字的 大小;第22页/共105页第二十三页,共105页。对于(duy)直接插入排序:最好的情况(关键字在记录序列最好的情况(关键字在记录序列(xli)中顺序有序):中顺序有序):“比较(bjio)”的次数:最坏的情况(关键字在记录序列中逆序有序):最坏的情况(关键字在记录序列中逆序有序):“比较”的次数:0“移动”的次数:“移动”的次数:第23页/共105页第二十四页,共105页。二、希尔排序二、希尔排序(pi x)(又称缩小增量排序(又称缩小增量排序(pi x))基本(jb
12、n)思想:对待排记录序列先作“宏观”调整,再作“微观”调整。所谓“宏观(hnggun)”调整,指的是,“跳跃式”的插入排序。具体做法为:第24页/共105页第二十五页,共105页。将记录序列(xli)分成若干子序列(xli),分别对每个子序列(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
13、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 16 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
14、=L.rj;/记录后移,查找记录后移,查找(ch zho)插入位置插入位置 L.rj+dk=L.r0;/插入插入 /if/ShellInsert第27页/共105页第二十八页,共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 x
15、i)进行交换的记录位置 /iffor(j=1;j i;j+)lastExchangeIndex=1;第31页/共105页第三十二页,共105页。注意注意(zh(zh y):y):2.一般情况下,每经过一趟“起泡”,“i 减一”,但并不是(b shi)每趟都如此。例如例如(lr):2553157989i=7i=6for(j=1;j i;j+)if(Rj+1.key Rj.key)13i=21.起泡排序的结束条件为,最后一趟没有进行最后一趟没有进行“交换记录交换记录”。第32页/共105页第三十三页,共105页。时间时间(shjin)(shjin)分析分析:最好的情况(关键字在记录最好的情况(关键
16、字在记录(jl)序列中顺序有序):序列中顺序有序):只需进行一趟起泡只需进行一趟起泡“比较比较(bjio)”的次数:的次数:最坏的情况(关键字在记录序列中逆序有序):最坏的情况(关键字在记录序列中逆序有序):需进行需进行n-1趟起泡趟起泡“比较比较”的次数:的次数:0“移动移动”的次数:的次数:“移动移动”的次数:的次数:n-1第33页/共105页第三十四页,共105页。二、一趟快速二、一趟快速(kui s)排序(一次划分)排序(一次划分)目标:找一个记录,以它的关键字作为目标:找一个记录,以它的关键字作为“枢轴枢轴”,凡其关键字小于枢轴的记录均,凡其关键字小于枢轴的记录均移动移动(ydng)
17、至该记录之前,反之,凡关至该记录之前,反之,凡关键字大于枢轴的记录均移动键字大于枢轴的记录均移动(ydng)至该至该记录之后。记录之后。致使(zhsh)一趟排序之后,记录的无序序列Rs.t将分割成两部分:Rs.i-1和Ri+1.t,且 Rj.key Ri.key Rj.key (sji-1)枢轴 (i+1jt)。第34页/共105页第三十五页,共105页。stlowhigh设设 Rs=52 为枢为枢轴轴(sh zhu)将 Rhigh.key 和 枢轴的关键字进行(jnxng)比较,要求Rhigh.key 枢轴的关键字 将 Rlow.key 和 枢轴的关键字进行比较(bjio),要求Rlow.k
18、ey 枢轴的关键字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,并保证 Rhigh.key52,和 Rlow.key52,否则(fuz)进行记录的“交换”。第36页/共105页第三十七页,共105页
19、。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第37页/共105页第三十八页,共105页。int Partition(RedType R,int low,int high)/Partition R0=Rlow;pivotkey=Rlow.key;
20、/枢轴(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 low;第38页/共105页第三十九页,共105页。三、快速三、快速(kui s)排序排序 首先对无序的记录序列进行“一次划分”,之后分别对分割所得两个(lin)子序列“递归”进行快速排序。无 序 的 记 录 序 列无序记录(jl)子序列(1)无序子序列(2)枢轴枢轴一次
21、划分分别进行快速排序第39页/共105页第四十页,共105页。void QSort(RedType&R,int s,int t)/对记录序列对记录序列Rs.t进行进行(jnxng)快速排序快速排序 if(s t-1)/长度大于长度大于1 /QSortpivotloc=Partition(R,s,t);/对 Rs.t 进行(jnxng)一次划分QSort(R,s,pivotloc-1);/对低子序列(xli)递归排序,pivotloc是枢轴位置QSort(R,pivotloc+1,t);/对高子序列递归排序第40页/共105页第四十一页,共105页。void QuickSort(SqList&L
22、)/对顺序表进行对顺序表进行(jnxng)快速排序快速排序 QSort(L.r,1,L.length);/QuickSort 第一次调用函数 Qsort 时,待排序(pi x)记录序列的上、下界分别为 1 和 L.length。第41页/共105页第四十二页,共105页。四、快速四、快速(kui s)排序的时间分析排序的时间分析假设一次划分所得枢轴位置 i=k,则对n 个记录进行(jnxng)快排所需时间:其中 Tpass(n)为对 n 个记录(jl)进行一次划分所需时间。若待排序列中记录的关键字是随机分布的,则 k 取 1 至 n 中任意一值的可能性相同T(n)=Tpass(n)+T(k-1
23、)+T(n-k)第42页/共105页第四十三页,共105页。设 Tavg(1)b则可得结果(ji gu):结论结论:快速快速(kui s)排序的时间复杂度为排序的时间复杂度为O(nlogn)由此可得快速排序(pi x)所需时间的平均值为:第43页/共105页第四十四页,共105页。若待排记录的初始状态为按关键字有序时,若待排记录的初始状态为按关键字有序时,快速排序快速排序(pi x)将蜕化为起泡排序将蜕化为起泡排序(pi x),其时间复杂度为其时间复杂度为O(n2)。为避免出现这种情况,需在进行一次划分之前(zhqin),进行“予处理”,即:先对 R(s).key,R(t).key 和 R(s
24、+t)/2.key,进行相互比较(bjio),然后取关键字为 “三者之中”的记录为枢轴记录。第44页/共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(
25、Elem R,int n)/对记录序列对记录序列R1.n作简单作简单(jindn)选择排序。选择排序。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)“筛选筛选
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 分析 学习 教案
限制150内