数据结构11-内部排序算法的比较和应用以及外部排序

东阳的学习记录

内部排序算法的比较和应用

比较

注意图中颜色的对应

  • 亮黄色框住的代表特殊情况下的时间复杂度,需要特别记忆。
  • 屎黄色框住的代表该排序算法不稳定。
  • 绿色框住的代表该排序算法的每一趟排序,都确定一个元素的最终位置。
    在这里插入图片描述

应用

考虑因素:元素数目、元素大小、关键字结构及分布、稳定性、存储结构、辅助空间等;

  1. 当n较小时(n<=50),可采用直接插入排序或者简单选择排序;若n较大,则采用快排、堆排序或归并排序;
    • 其中快排适合初始序列无序的情况,若初始序列基本有序,或者需要O(1)的空间复杂度,则不应选择快排;
    • 堆排和快排都是不稳定的
    • 归并排序是稳定的
  2. 若n很大,记录关键字位数较少且可分解,采用基数排序;
  3. 当文件的n个关键字随即分布时,任何基于比较的排序算法,至少需要 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)的时间;
  4. 若初始序列基本有序,则采用直接插入排序和冒泡排序( O ( n ) O(n) O(n));
  5. 当记录元素比较大时,应避免大量移动的排序算法,采用链式存储。

外部排序算法

外部排序通常采用归并排序方法。

  1. 首先,根据内存大小,将外村文件划分为若干等分,依次读入内存,并使用内部排序算法对该子序列进行排序,再将排好序的子序列写回外存中。这些子序列被称为归并段
  2. 对归并段进行归并排序过程;这里不是直接将整个归并段全部输入到内存中,(有点类似队列),将内存分为输出缓冲区1,2和输出缓存区,对于归并段1358和归并段2467,每次只将每个归并段的前两位放入内存的输入缓冲区中,依次比较,当其中一个输入缓冲区为空时,再将对应的归并段的剩余部分放入(可以用队列实现吧)。
    在这里插入图片描述

外部排序的时间复杂度

外部排序的总时间 = 内部排序需要的时间 + 外存读写时间 + 内部归并时间
其中外存读写时间远大于另外两个

归并趟数 = [ l o g m r ] [log_mr] [logmr]
易知:增加对应归并的路数就会减少磁盘io次数

失败树

树形选择排序的一种变体,可视为一棵完全二叉树。每个结点存放归并段再归并过程中当前参加比较的记录,背部结点用来记忆左右子树中的失败者,胜利者继续向上比较。

S趟归并总共需要的次数
S ( n − 1 ) ( m − 1 ) = l o g m r ( n − 1 ) ( m − 1 ) S(n-1)(m-1) = log_mr(n-1)(m-1) S(n1)(m1)=logmr(n1)(m1)

使用失败树后: S ( n − 1 ) ( m − 1 ) = l o g m r ( n − 1 ) l o g 2 m = l o g 2 r ( n − 1 ) S(n-1)(m-1) = log_mr(n-1)log_2m = log_2r(n-1) S(n1)(m1)=logmr(n1)log2m=log2r(n1)

使用失败树可以避免内部归并时间的增加,但仍受到缓冲区大小的限制,路数过多同样会增加外存读写时间。

置换-选择排序算法

通过置换-选择算法,可以得到长度不等的归并段

设初始待排序文件为FI,初始归并段文件为FO,内存工作区为WA,内存工作区可容纳w个记录。

算法思想

  1. 从待排序文件FI输入w个记录到工作区WA;
  2. 从WA中选取关键字最小的记录(比此时的MINIMAX大的最小值)保证有序,赋值给MINIMAX;若找不到这样的MINIMAX,则输出一个结束标志到FO中;
  3. 将MINIMAX输出到FO中;
  4. 若FI不为空,返回第一步;
    在这里插入图片描述

最佳归并树

带权路径长度最小的树(哈夫曼树)
设由置换-选择排序得到9个初始归并段,分别1,2,3,4,5,6,7,8,9
据此构建哈夫曼树,这样的哈夫曼树即为最佳归并树

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东阳z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值