数据库——排序要领.pptVIP

  • 2
  • 0
  • 约 55页
  • 2017-06-07 发布于湖北
  • 举报
本章主要内容 本章主要内容,本章详细介绍了排序的基本概念和常见的排序方法,包括常用的内部排序方法,外部排序方法等内容。通过本章的学习,应掌握如下内容: l???????? 插入排序 l??????? ? 交换排序 l??????? ? 选择排序 l??????? ? 归并排序 l??????? ? 基数排序 l????????? 外部排序 l 各种排序的比较 算法分析: 时间复杂度:在n个记录的待排序列中,一次划分需要约n次关键码比较。若每次划分的前后两部分数据元素个数基本相等,则需要经过log2n次划分,所以算法时间复杂度为nlog2n,最坏情况下,时间复杂度为O(n2)。 空间复杂度:快速排序是递归的,每层递归调用的指针和参数均要用栈来存放,递归调用次数与二叉树的深度一致。存储开销在理想情况下为O(log2n),即树的高度;在最坏情况下,二叉树是一个单支,这时算法的空间复杂度为为O(n)。 53 36 85 47 91 输出30,将91送入堆顶,调整恢复堆 53 47 85 91 36 输出24,将53送入堆顶,调整恢复堆 36 30 85 47 91 53 53 36 85 47 30 91 85 91 输出53, 将91送入堆顶 91 85 53 47 85 91 输出36,将91送入堆顶,调整恢复堆 53 85 91 47 53 85 91 输出47,将91送入堆顶, 调整恢复堆 91 85 53 归并的含义是将两个或两个以上的有序序列归并成一个新的有序表。归并排序可分为多路归并排序和两路归并排序。它既可以用于内部排序,也可以用于外部排序。 一趟两路归并算法的思想(以升序为例):先用两个指针分别指向两个序列的第一个数据元素,进行比较,取出较小者,然后将其所在序列的指针后移,重复以上过程,直到指针达到序列的末尾,这时将另一个序列的剩余元素依次顺序放到有序序列的后面即可。 10.5 归并排序 将两个有序序列L-data[t..m]和L-data[m+1..n]归并为有序序列L1-[t..n]的过程: ⑴ i=t;j=m;k=t; ⑵ 若im 或 jn,执行⑸; ⑶ 比较L-data[i]和L-data[j]关键字,将较小的存入L1中: 如果L-data[i].keyL-data[j].key; L1-data[k]=L-data[i];i++; k++;执行⑵; 否则,L1-data[k]=L-data[j];j++;k++;执行⑵; ⑷ 将尚未处理完的子表中元素存入L1; 如果i=m,将L-data[i…m]存入L1-data[k…n]; 如果j=n,将L-[j…n]存入L1-data[k…n]; ⑸ 合并结束。 【算法9.7】 一趟两路归并排序 void Merge(SL *L,SL *L1,int t,int m,int n) { for(i=t,j=m,k=t;i=m j=n;k++) { if(L-data[i].keyL-data[j].key) { L1-data[k]=L-data[i];i++;} else {L1-data[k]=L-data[j];j++;} } /* for */ if(i=m) L1-data[k…n]=L1-data[i…m-1]; if(j=n) L1-data[k…n]=L1-data[j…n]; } /*Merge*/ 【例10-7】有一个序列12,9,44,10,99,61,65,43,76,其两路归并算法的过程: 初始关键字 [12] [9] [44] [10] [99] [61] [65] [43] [76] 一趟归并后 [9 12] [10 44] [61 99] [43 65] [76] 二趟归并后 [9 10 12 44] [43 61 65 99] [76] 三趟归并后 [9 10 12 43 44 61 65 99] [76] 四趟归并后 [9 10 12 43 44 61 65 76 99 ] 两路归并排序思想:把序列所含的n个记录看作n个有序的子序列,然后两两归并,得[n/2]个长度为2或1的有序子序列;再两两归并,以此类推直到得到的子序列长度为n,排序完毕。 算法分析: 空间复杂度为O(n)。 时间复杂度:对包含n个数据元素的表,将这n个数据元素看作叶子结点,若将两两归

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档