收藏 分享(赏)

内部排序.doc

上传人:s36f12 文档编号:9582329 上传时间:2019-08-16 格式:DOC 页数:13 大小:571.50KB
下载 相关 举报
内部排序.doc_第1页
第1页 / 共13页
内部排序.doc_第2页
第2页 / 共13页
内部排序.doc_第3页
第3页 / 共13页
内部排序.doc_第4页
第4页 / 共13页
内部排序.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、内部排序排序有两种,即有内部和外部排序之分。此处主要涉及内部排序,本章内容提要如下:本章主要内容: (1 ) 、排序的基本概念 (2 ) 、插入排序方法:直接选择排序、二分插入排序 (3 ) 、快速排序、选择排序、归并排序 (4 ) 、各种排序方法性能比较 本章重点: 直接选择排序、二分插入排序、快速排序、 选择排序、归并排序 本章难点: 堆排序、快速排序、归并排序一、 基本概念排序(sort):将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。 数据表( datalist ):它是待排序数据对象的有限集合。主关键字( key ):数据对象有多个属性域, 即多个数据成员组成, 其中有

2、一个属性域可用来区分对象, 作为排序依据,称为关键字(也称为排序码) 。排序方法的稳定性:如果在对象序列中有两 个对象 ri和 rj, 它们的排序码 ki = kj , 且在排序之前, 对象 ri排在 rj前面。如果在排序之后, 对象 ri仍在对象 rj的前面, 则称这个排序方法是稳定的, 否则称这个排序方法是不稳定的。注:稳定性这个很是依赖于排序时所选取的“步长” ,看示例必有所得。内排序与外排序:内排序是指在排序期间数据对象全部存放在内存的排序;外排序是指在排序期间全部对象个数太多,不能同时存放在内存,必须根据排序过程的要求,不断在内、外存之间移动的排序。排序的时间开销:排序的时间开销是衡

3、量算法好坏的最重要的标志。排序的时间开销可用算法执行中的数据比较次数与数据移动次数来衡量。内排序分类(1 ) 、依不同原则插入排序、交换排序、选择排序、归并排序、和计数排序等。 (2 ) 、依所须工作量简单排序-时间复杂度 o(n2)先进排序方法-时间复杂度 o(n logn)基数排序-时间复杂度 o(d.n)二、 插入排序1.直接插入排序基本思想:每步将一个待排序的对象, 按其排序码大小, 插入到前面已经排好序的一组对象的适当位置上, 直到对象全部插入为止。例如:已知待排序的一组记录的初始排列如下:R(49),R(38),R(65,R(97),R(76),R(13),R(27),R(49 *

4、),其直接插入算法演示如下:由上面的过程我们可以看到,直接插入排序是一种稳定的排序方式(其所选取的步长不大) 。直接插入排序可以理解为从首关键字开始,不断地扩展有序区直到整个记录是按关键字有序的序列为止。而且,当关键字记录数量 n 很小时,其效率很高,但是一旦数量变大时,就不推荐使用直接插入排序了。算法分析:(1 ) 、排序码比较次数和对象移动次数与对象排序码的初始排列有关;(2 ) 、最好情况(记录中关键字非递减有序排列)下,需比较关键字 n-1 次,移动关键字 0 次;(3 ) 、最坏情况(记录中关键字非递增有序排列)下,需比较关键字(n+2 ) (n-1 )/2 次,移动关键字(n+4

5、) (n-1 )/2)次; (4 ) 、由于待排序列的随机性,我们此处取上述最值的平均值作为比较依据,即对于直接插入排序其所需的关键字比较次数和移动次数,约为 n*n/4 次。由此得直接插入的时间复杂度为 O(n2) ;(5 ) 、直接插入排序只需要一个 记录的辅助空间,其时间复杂度为 O(1) 。2.折半插入排序基本思想:设在顺序表中有一 个对象序列 V0, V1, , Vn-1。其中, V0, V1, , Vi-1 是已经排好序的对象。在插入 Vi 时, 利用折半搜索法寻找 Vi 的插入位置。例如:已知待排序的一组记录的初始排列如下:R(49),R(38),R(65,R(97),R(76)

6、,R(13),R(27),R(49 *),其直接插入算法演示如下:注:由于想表达清楚程序的每一步执行很麻烦,为节约时间起见,大家可试着自行弄清楚其执行过程,不然可与同学讨论初始关键字:( 49 ) ( 49 ) 38 65 97 76 13 27 49*i=2: ( 38 ) ( 38 49 ) 65 97 76 13 27 49*i=3: ( 65 ) ( 38 49 65 ) 97 76 13 27 49*i=4: ( 97 ) ( 38 49 65 97 ) 76 13 27 49*i=5: ( 76 ) ( 38 49 65 76 97 ) 13 27 49*i=6: ( 13 ) (

7、 13 38 49 65 76 97 ) 27 49*i=7: ( 27 ) ( 13 27 38 49 65 76 97 ) 49*i=8: ( 49* ) ( 13 27 38 49 49* 65 76 97 )有序区扩展方向序号: 0 1 2 3 4 5 6 7 原记录: 49 38 65 97 76 13 27 49*i=2:i=3:i=4:i=5:i=6:i=7:i=8:序号: temp 0 1 2 3 4 5 6 7 i=1: 49 38 65 97 76 13 27 49*i=1: (38) 49 38 65 97 76 13 27 49*i=1: (38) 49 38 65 9

8、7 76 13 27 49*i=2: (65) 38 49 65 97 76 13 27 49*i=2: (65) 38 49 65 97 76 13 27 49*i=3: (97)i=3: (97)i=4: (76)i=4: (76)i=5: (13)i=5: (13)i=6: ()i=6: ()i=7:i=8:折半插入算法代码参考:typedef int SortData; void BinInsSort ( SortData V , int n )SortData temp;int Left, Right; for ( int i = 1; i = Left; k- )Vk+1 = Vk

9、; /记录后移VLeft = temp; /插入由上面的代码及其执行过程,我们可知折半插入排序是一个稳定的排序方法,并且折半插入排序仅仅是减少了关键字间的比较次数,而记录的移动次数并没有减少。算法分析:(1 ) 、折半查找比顺序查找快, 所以折半插入排序就平均性能来说比直接插入排序要高;(2 ) 、在插入第 i 个对象时 , 需要经过 +1 次排序码比较 , 才能确定它应插入的位i2log置。因此, 将 n 个对象( 为推导方便 , 设为 n=2k )用折半插入排序所进行的排序码比较次数为: ;1 22l1logi ni(3 ) 、在对象的初始排列已经按排序码排好序或接近有序时, 直接插入排序

10、比折半插入排序执行的排序码比较次数要少。折半插入排序的对象移动次数与直接插入排序相同, 依赖于对象的初始排列;(4 ) 、折半插入排序的时间复杂度为 o(n2)。3、希尔排序(又称缩小增量排序)基本思想:设待排序对象序列有 n 个对象, 首先取一个整数 gap 时,可减少到 n( )22。2l三、交换排序(Exchange Sort )基本思想:是两两比较待排序对象的排序码,如发生逆序(即排列顺序与排序后的次序正好相反),则交换之 ,直到所有对象都排好序为止。1.起泡排序基本方法:设待排序对象序列中的对象个数为 n。一般地,第 i 趟起泡排序从 1 到 n-i+1 依次比较相邻两个记录的关键字

11、,如果发生逆序,则交换之。其结果是这 n-i+1 个记录中,关键字最大的记录被交换到第 n-i+1 的位置上,最多作 n-1 趟。例如:49 38 38 38 38 13 1338 49 49 49 13 27 2765 65 65 13 27 38 3897 76 13 27 49 4976 13 27 49* 49*13 27 49* 6527 49* 7649* 970 1 2 3 4 5 6 第 i 趟排序由上面的执行过程,我们可知起泡排序是一个稳定的排序方法。算法分析:(1 ) 、最好情况(对象的初始排列已经按排序码从小到大排好序)下,此算法只执行1 趟起泡,做 n-1 次排序码比较

12、并且不需要移动对象;(2 ) 、最坏情况(初始记录序列逆序排列)是算法执行 n-1 趟起泡,第 i 趟 (1 i n) 做 n- i 次排序码比较, 执行 n-i 次对象交换。这样在最坏情形下总的排序码比较次数 KCN和对象移动次数 RMN 为:1123nii nRMNKC)()((3 ) 、起泡排序的时间复杂度为 O(n2 ) 。2.快速排序基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以对这两部分记录继续进行排序,已达到整个序列有序。一一一一一一一21 08254925*16一一一一一 08254925*162108 254925

13、*1608 254925*1608 254925*1608 254925*1621prikey一一一一一一一一一一一一一一一一一一一一一一 i ji j ji i jjiji08 254925*1621一一一一一一一一一一一一一一 08 254925*1621一一一一 08 254925*1621由上面的执行过程,我们知道快速排序是一种不稳定的排序方法。算法分析:(1 ) 、算法 partition 利用序列第一个对象作为基准,将整个序列划分为左右两个子序列。算法中执行了一个循环, 只要是排序码小于基准对象排序码的对象都移到序列左侧, 最后基准对象安放到位, 函数返回其位置;、快速排序是递归的

14、,需要有一个栈存放每层递归调用时的指针和参数;、快速排序的趟数取决于递归树的高度,最大递归调用层次数与递归树的高度一致,理想情况为 log2(n+1) 。因此,要求存储开销为 O(log2n)。(2 ) 、可以证明, 函数 quicksort 的平均计算时间也是 O(nlog2n)。实验结果表明: 就平均计算时间而言, 快速排序是所有内排序方法中最好的一个;(3 ) 、最坏情况(待排序列已按排序码小大排好) ,其递归树成为单支树 , 每次划分只得到一个比上一次少一个对象的子序列。总的排序码比较次数将达;211nini )()((4 ) 、时间上看,快速排序优于前面的各种排序方法; 空间 上看,

15、前面的各种方法只需要一个记录的附加空间即可,而快速排序则需要一个栈(注:此栈空间与深度完全取决于递归树的大小与深度)空间来实现递归。四、选择排序基本思想:每一趟 (例如第 i 趟, i = 0, 1, , n-2) 在后面 n-i 个待排序记录中选出排序码最小的记录, 作为有序序列中的第 i 个记录。待到第 n-2 趟作完, 待排序记录只剩下 1 个就不用再选了。1.直接选择排序基本步骤是:在一组对象 ViVn-1 中选择具有最小排序码的对象;若它不是这组对象中的第一个对象, 则将它与这组对象中的第一个对象对调;在这组对象中剔除这个具有最小排序码的对象。在剩下的对象 Vi+1Vn-1中重复执行

16、第、步, 直到剩余对象只有一个为止。21254925*16080 1 2 3 4 521 25*i = 04925 1625 1608 49 0825*49 21i = 1i = 20816 25*2521初 始初 始 最 小 者 08交 换交 换 21,最 小 者 16交 换交 换 25,最 小 者 21交 换交 换 49,一一一一一一一一一最 小 者 25*无 交 换无 交 换4925*0 1 2 3 4 525*i = 4251608 4925* 4921结 果i = 3816 2521 最 小 者 25无 交 换无 交 换25211608一一一一一一一一注:理解简单选择排序的原理就好,

17、其实思想很简单的。由上面的执行过程,我们可知简单选择排序是一种不稳定的排序方法(慢排中的不稳定的排序方法,一大特例,特别针对于认为“快就不稳定”这一想法的同学) 。算法分析:(1 ) 、直接选择排序的排序码比较次数 KCN 与对象的初始排列无关。设整个待排序对象序列有 n 个对象 , 则第 i 趟选择具有最小排序码对象所需的比较次数总是 n-i-1 次。总的排序码比较次数为:;2021ni nKCN)()((2 ) 、对象的移动次数 RMN 与对象序列的初始排列有关。当这组对象的初始状态是按其排序码从小到大有序的时候, 对象的移动次数 RMN = 0,达到最少。最坏情况是每一趟都要进行交换,总

18、的对象移动次数为 RMN = 3(n-1);(3 ) 、简单选择排序的时间复杂度为 O(n2 ) 。2.树形选择排序(又称锦标赛排序)基本思想:首先对 n 个记录的关键字进行两两比较,然后在其中 个较小者之间再2n进行两两比较,如此重复,直至选出最小关键字的记录为止。这过程中可用一颗有 n个结点的完全二叉树表示。注:相关演示过程参考课本 P279 页。3.堆排序注:建的一般是小顶堆,而排序多用大顶堆。堆的定义:n 个元素的序列 k1,k2,,kn当且仅当满足下列关系时,称之为堆。Ki K2i+1 & Ki K2i+2 或 Ki K2i+1 & Ki K2i+2*堆的相关内容亲请参考老师的 PP

19、T*五、归并排序归并即将两个或两个以上的有序表合并成一个新的有序表。2-路归并排序:假设初始序列含有 n 个记录,则可以看成是 n 个有序的子序列,每个子序列的长度为 1,然后两两归并,得到 个长度为 2 或 1 的有序子序列;再两两归并,如此重复,直至得到一个长度为 n 的有序序列为止。例如:初始关键字 (49) (38) (65) (97) (76 ) (13) (27)一趟归并后 (38 49) (65 97) (13 76)(27 )二趟归并后 (38 49 65 97) (13 27 76)三趟归并后 (13 27 38 49 65 76 97 )算法的核心操作是将一维数组中前后相邻

20、的两个有序序列归并为一个有序序列。由上面的执行过程,我们可知归并排序是一种稳定的排序方法。算法分析:(1 ) 、实现归并排序需和待排记录等数量的辅助空间,其时间复杂度为 O(nlogn) ;(2 ) 、一般情况下,很少用 2-路归并排序法进行内部排序。六、基数排序基本思想:借助对关键字排序的思想对单逻辑关键字进行排序,不需要进行记录字间的比较。1.多关键字排序(大家自行看课本 P285 页)例 对 52 张扑克牌按以下次序排序:23A23A23A23A两个关键字:花色( ) 值(23A) ,并且 “花色”地位高于“面值”。多关键字排序的两种方法:1.最高位优先法 2.最低位优先法2.链式基数排

21、序基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序。 一一一一一一2781090639305891845026908083109589269278063930 08318450 08e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9一一一一9300630831845027808109589269一一一一一5008109930063269278083184589一一一一一08318458906350 269930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9一一一一08109 27893006308318

22、45027808109589269一一一一一0806308310918426927850589930一一一一一10908184 930e0e1e2e3e4e5e6e7e8e9f0f1f2f3f4f5f6f7f8f9一一一一063083 269278 505895008109930063269278083184589一一一一一各种内部排序方法的比较排序方法 平均时间 最坏情况 最好情况 辅助空间 稳定性插入排序 O(n2 ) O(n2 ) O(n) O(1) 选择排序 O(n2 ) O(n2 ) O(n2 ) O(1) 起泡排序 O(n2 ) O(n2 ) O(n) O(1) 快速排序 O(nlogn) O(n2 ) O(nlogn) O(logn) 堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 基数排序 O(d*n) O(d*n) O(d*n) O(n) 注:实际应用中选择哪一种排序方法既要考虑算法本身的特性又要考虑关键字本身所选取的数据结构与存储结构等。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报