一、内部排序的比较:
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 的子文件,依次的读入内存并利用有效的内部排序方法对他们进行排序,并将排序后得到的有序子文件重新写回外存,通常称这些有序子文件为归并段或者顺串。
然后,对这些归并段进行逐趟归并,使得归并段(有序的子文件)逐渐由小到大,直至得到整个有序文件为止。
之后还可以采用多路平衡归并和败者树,置换-选择排序,最佳归并树进行处理,这里就不一一展开了。