内部排序和外部排序小结

一、内部排序的比较:

1、从时间复杂度来看:

简单选择排序、直接插入排序和冒泡排序的平均复杂度都为 O(n2),并且实现过程也较为简单,但是直接插入排序和冒泡排序在最好的情况下时间复杂度可以达到 O(n),而简单选择排序则与序列的初始状态无关。

希尔排序作为插入排序的扩展,对较大规模的排序都可以达到很高的效率,但是目前未得出其精确的渐近时间。

堆排序是利用一种称为堆的数据结构,可以在线性时间内完成建堆,并且在 O(nlogn)内完成排序过程。

快速排序是基于分治的思想,虽然最坏的情况下快排的时间复杂度会到达 O(n2),但快速排序的平均性能可以达到 O(nlogn),在实际应用中常常优于其他的算法。

归并排序同样是基于分治的思想,但由于其分割子序列与初始序列的排序无关,因此它的最好、最坏和平均时间复杂度均为 O(nlogn)。

2、从空间复杂度来说:

简单选择排序、插入排序、冒泡排序和希尔排序、堆排序都仅要借助常数个辅助空间。

快速排序在空间上只使用一个小的辅助栈,用于实现递归,平均情况下大小为 O(logn),当然在最坏的情况下可能会增长到 O(n)。

二路归并排序在合并操作中需要借助较多的辅助空间用于元素复制,大小为O(n),虽然有方法可以克服这个缺点,但是其代价是算法会很复杂而且时间复杂度会增加。

3、从稳定性来看:

直接插入排序、冒泡排序、归并排序和基数排序都是稳定的排序算法,而简单选择排序、快速排序、希尔排序和堆排序都是不稳定的排序方法。

 冒泡排序和堆排序在每次循环后都能产生当前的最大值或者最小值,而快速排序依次循坏就确定一个元素的最终位置。

由于希尔排序的时间复杂度依赖于增量函数,所以这里无法准确的给出时间复杂度

    算法种类                              时间复杂度         空间复杂度          是否稳定
   最好情况     平均情况   最坏情况
直接插入排序O(n)O(n2)O(n2)O(1)
冒泡排序O(n)O(n2)O(n2)O(1)
简单选择排序O(n2)O(n2)O(n2)O(1) 否
希尔排序O(n2)O(n1.3) O(1) 否
快速排序O(nlogn)O(nlogn)O(n2)O(nlogn) 否
堆排序O(nlogn)O(nlogn)O(nlogn)O(1) 否
2-路归并排序O(nlogn)O(nlogn)O(nlogn)O(n) 是
基数排序O(d(n+r))O(d(n+r))O(d(n+r))O(r) 是

排序算法小结:

1、若n较小(n<=50),则可以采用直接插入排序或者简单选择排序。由于直接插入排序所需的记录移动操作较简单选择排序多,因而当记录本身信息量较大时,用简单选择排序较好。

2、若文件的初始状态已按关键字基本有序,则选择直接插入或者冒泡排序为宜。

3、若n较大,则应采用时间复杂度为O(nlogn)的排序方法:快速排序、堆排序或归并排序。快排被认为目前基于比较的内部排序法中最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。

堆排序所需的辅助空间少于快排,并且不会出现快排可能出现的最坏情况,这两种排序都是不稳定的。若要求排序稳定且时间复杂度为O(nlogn),则可以选择归排序。

4、若n很大,记录的关键字位数较少且可以分解时,采用基数排序较好。

5、当记录本身信息量较大时,为避免耗费大量的时间移动记录。可用链表作为存储结构。

 

二、外部排序

在内存中进行的排序称为内部排序,而在许多实际应用中,经常需要对大文件进行排序,因为文件中的记录很多,信息量庞大,无法将整个文件拷贝进内存进行排序。因此,需要将带排序的记录存储在外存上,排序时再把数据一部分一部分的调入内存进行排序,在排序中需要多次进行内外存的交互,对外存文件中的记录进行排序后的结果仍然被放到原有文件中。这种排序方法就称外部排序。

由于外存设备的不同,外部排序通常分为磁盘文件排序和磁带文件排序。磁盘是直接存取设备,磁带是顺序存取设备。

文件通常是按块存储在磁盘上,操作系统也是按块对磁盘上的信息进行读写的。因为磁盘读写的机械运动所需的时间远远超过内存计算的时间。因此,在外部排序过程中的时间代价主要考虑访问磁盘的次数,即i/o次数。

外部排序通常采用归并排序:它包括两个相对独立的阶段:首先,根据内存缓存区的大小,将外存上含有n个记录的文件分割成若干长度为 h 的子文件,依次的读入内存并利用有效的内部排序方法对他们进行排序,并将排序后得到的有序子文件重新写回外存,通常称这些有序子文件为归并段或者顺串。

然后,对这些归并段进行逐趟归并,使得归并段(有序的子文件)逐渐由小到大,直至得到整个有序文件为止。

之后还可以采用多路平衡归并和败者树,置换-选择排序,最佳归并树进行处理,这里就不一一展开了。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值