计算机软件及应用数据结构排序中国石油大学华东_第1页
计算机软件及应用数据结构排序中国石油大学华东_第2页
计算机软件及应用数据结构排序中国石油大学华东_第3页
计算机软件及应用数据结构排序中国石油大学华东_第4页
计算机软件及应用数据结构排序中国石油大学华东_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

1概述插入排序(直接、折半、希尔)快速排序交换排序(气泡)选择排序(直接)归并排序第九章排序2排序算法的稳定性:如果在元素序列中有两个元素r[i]和r[j],它们的排序码k[i]

==k[j]

,且在排序之前,元素r[i]排在r[j]前面。如果在排序之后,元素r[i]仍在元素r[j]的前面,则称这个排序方法是稳定的,否则称这个排序方法是不稳定的。内排序与外排序:内排序是指在排序期间数据元素全部存放在内存的排序;外排序是指在排序期间全部元素个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。39.2插入排序(InsertSorting)基本方法是:每步将一个待排序的元素,按其排序码大小,插入到前面已经排好序的一组元素的适当位置上,直到元素全部插入为止。基本思想是:当插入第i(i≥1)个元素时,前面的V[0],V[1],…,V[i-1]已经排好序。这时,用V[i]的排序码与V[i-1],V[i-2],…的排序码顺序进行比较,后移,找到插入位置即将V[i]插入。9.2.1直接插入排序(InsertSort)4各趟排序结果21254925*1608012345012345temp21254925*160825i=1012345temp21254925*160849i=25012345i=4i=5i=3012345temp21254925*160816012345temp21254925*160825*012345temp21254925*1608086算法分析设待排序元素个数为currentSize=n,则该算法的主程序执行n-1趟(第一个元素不用插入)。排序码比较次数和元素移动次数与元素排序码的初始排列有关。最好情况下,排序前元素已按排序码从小到大有序,每趟只需与前面有序元素序列的最后一个元素比较1次,总的排序码比较次数为n-1,元素移动次数为0。21254925*16080123457最坏情况下,第i趟时第i个元素必须与前面i个元素都做排序码比较,并且每做1次比较就要做1次数据移动。2125492816080123458平均情况下排序的时间复杂度为o(n2)。直接插入排序是一种稳定的排序方法。基本思想是:设在顺序表中有一个元素序列V[0],V[1],…,V[n-1]。其中,V[0],V[1],…,V[i-1]是已经排好序的元素。1)在插入V[i]时,利用折半搜索法寻找V[i]的插入位置。2)找到位置后,再将插入位置之后的元素向后顺次移动。3)插入。折半插入排序(BinaryInsertsort)9算法分析折半搜索比顺序搜索快,所以折半插入排序就平均性能来说比直接插入排序要快。它所需的排序码比较次数与待排序元素序列的初始排列无关,仅依赖于元素个数。折半插入排序是一个稳定的排序方法。

10希尔排序方法又称为缩小增量排序,基本思想是:1)选择一个步长序列d1,d2,…,dk,其中di>dj(i<j),dk=1;2)按步长序列个数k,对序列进行k趟排序;3)第I趟排序时,从第一个关键字开始,将间隔为di的关键字组成一个序列;从第二个关键字开始,将间隔为di的关键字组成一个序列;

……………………

从第di个关键字开始,将间隔为di的关键字组成一个序列分别对各序列进行直接插入排序。4)重复上述步骤,仅步长因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。9.2.3希尔排序(ShellSort)取d3=1三趟分组:1327485544938659776三趟排序:4132738484955657697例初始:4938659776132748554一趟排序:13

27

48

55

4

49

38

65

97

76二趟排序:13

4

48

38

27

49

55

65

97

76取d1=5一趟分组:49

38

65

97

76

13

27

48

55

4取d2=3二趟分组:13

27

48

55

4

49

38

65

97

7612算法分析:希尔排序是一种不稳定的排序方法。Gap的取法有多种。最初shell提出取gap=

n/2

,gap=

gap/2

,直到gap=1。knuth提出取gap=

gap/3

+1。还有人提出都取奇数为好,也有人提出各gap互质为好。想要弄清排序码比较次数和元素移动次数与增量选择之间的依赖关系,并给出完整的数学分析,还没有人能够做到。13交换排序(ExchangeSort)基本思想是两两比较待排序元素的排序码,如果发生逆序,则交换之。直到所有元素都排好序为止。思想:小的浮起,大的沉底。从左端开始比较。第一趟:第1个与第2个比较,大则交换;第2个与第3个比较,大则交换,……关键字最大的记录交换到最后一个位置上;第二趟:对前n-1个记录进行同样的操作,关键字次大的记录交换到第n-1个位置上;依次类推,则完成排序。冒泡排序(BubbleSort)9854209854208959492909998542095848280888420589552045894402458922结果㈠㈡㈢㈣开始㈤024589比较次数:5432116基本思想:①任取待排序元素序列中的某个元素作为基准(支点,一般去第一个),按照该元素的排序码大小,将整个元素序列划分为左右两个子序列:左侧子序列中所有元素的都小于基准元素右侧子序列中所有元素的都大于基准元素②基准元素则排在这两个子序列中间(这也是该元素最终应安放的位置)。③然后分别对这两个子序列重复施行上述方法,直到所有的元素都排在相应位置上为止。9.3快速排序(QuickSort)做法:附设两个指针low和high

,初值分别指向第一个记录和最后一个记录,设支点记录为r[1]

,(r[1]通常取第一个记录的值为基准值。)首先从high所指位置起向前搜索,找到第一个小于基准值的记录与基准记录交换(大的原地不动),然后从low

所指位置起向后搜索,找到第一个大于基准值的记录与基准记录交换(小的原地不动),重复这两步直至low=high为止。例初始关键字:4938659776132750LHr[1].KEY=49HL

完成一趟排序:(273813)49(76976550)分别进行快速排序:(13)

27

(38)49(5065)

76

(97)快速排序结束:13

27

3849

5065

76

974927LHLHLH4965HL1349LH4997LH199.4选择排序基本思想是:首先从1~n个元素中选出关键字最小的记录交换到第一个位置上。然后再从第2个到第n个元素中选出次小的记录交换到第二个位置上,依次类推。时间复杂度为O(n2),适用于待排序元素较少的情况。20直接选择排序(SelectSort)直接选择排序的算法如下:voidSelectSort(STBLL[],intn){inti,j,k,t;for(i=0,i<n;++i)

{k=i;第I小的元素

for(j=i+1;j<n;++j)if(L[j].key<L[k].key)k=j;if(k!=i){t=L[i];L[i]=L[k];L[k]=t;}}}9.4.3堆排序(HeapSort)堆:是具有特定条件的顺序存储的完全二叉树,其特定条件是:任何一个非叶子结点的关键字大于等于(或小于等于)子女的关键字的值。897624331510112536497856229.4.3堆排序(HeapSort)堆排序思想:设有n个元素,将其按关键字排序。首先将这n个元素按关键字建成堆,将堆顶元素输出,得到n个元素中关键字最小(或最大)的元素。然后,再对剩下的n-1个元素建成堆,输出堆顶元素,得到n个元素中关键字次小(或次大)的元素。如此反复,便得到一个按关键字有序的序列。称这个过程为堆排序。堆排序分为两个步骤:1)如何由一个无序序列建成一个堆?2)输出堆顶元素后,如何将剩余元素调整成一个新的堆?23(1)第二个问题解决方法——筛选6525365649784111(b)65365649784111(c)251125365649784165(a)25493656657841(d)11方法:输出堆顶元素之后,以堆中最后一个元素替代之;然后将根结点值与左、右子树的根结点值进行比较,并与其中小者进行交换;重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”24(2)第一个问题解决方法从无序序列的第

n/2个元素(即此无序序列对应的完全二叉树的最后一个非终端结点)起,至第一个元素止,进行反复筛选2556497811654136(a)无序序列n=8,int(n/2)=4开始2556493611654178(b):78被筛选后的状态2556413611654978(c):49被筛选后的状态2511413656654978(d):56被筛选后的状态(e):被筛选之后建成堆112541365665497825例含8个元素的无序序列(49,38,65,97,76,13,27,50)①先建成堆4965382713769750496538271376509749133827657650974913382765765097132738496576509726②进行堆排序13273849657650979727384965765013输出:132749389765765013输出:139749382765765013输出:13273849502765769713输出:13276549502738769713输出:132738274965502738769713输出:1327387665502738499713输出:132738495065762738499713输出:132738499765762738495013输出:13273849506597762738495013输出:13273849509765762738495013输出:132738495065287665972738495013输出:1327384950659765762738495013输出:132738495065769765762738495013输出:1327384950657697299.5归并排序(MergeSort)归并,是将两个或两个以上的有序表合并成一个新的有序表。把具有n个记录的表看成是n个有序的子表,每个子表的长度为1,然后两两归并,得到[n/2]个长度为2或为1的有序子表;再两两归并,如此重复,直到得到一个长度为n的有序表为止。初始序列[23][52][67][6][18][10]一趟归并后[2352][667][1018]二趟归并后[6235267][1018]三趟归并后[61018235267]31迭代的归并排序算法迭代的归并排序算

温馨提示

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

评论

0/150

提交评论