前言
分析各种不同情况在应用排序算法中的重要因素,观察不同类型的输入文件,比较各种排序算法的其他方式以及学习他们各自的特性。
在许多需要排序的应用程序中,首先我们常常只使用一次或者几次排序程序。如果一个基本排序算法不比其他数据处理,如数据读入和读出要慢, 就没有必要寻找一个更快的方法。如果需要排序的元素不是很多,我们宁愿实现并运行一个简单的方法,而不是将精力耗费在系统排序的接口或实现以及调试的方法上。其次,基本方法通常适合小型文件,复杂的算法会导致很高的开销,甚至比简单的方法更慢。
1. 选择排序
选择排序使用大概N^2/2次比较操作和N次交换(移动)操作。(结果与输入数据的顺序无关)
选择排序的缺点,它的运行时间对文件中已排序的部分依赖较少。
虽然选择排序比较简单但是执行时间上具有强迫性,但它对某一类重要文件的排序效率要比其他方法要好:对于元素比较大,关键字又比较小的文件,应该选择该方法,而其他算法的移动数据的步数都比选择排序要多。(其他排序算法移动数据的步数都比选择排序要多) 当然对于这种文件还可以考虑索引或指针排序。
2.插入排序
程序改进:观察哨的使用---通过使用观察哨,可以减少对于内层循环是否到达顶点的判断(并不是每次都要判断的),但是观察哨有时是难以使用的,一方面是由于最值的难以定义,另一方面调用程序没有空间包含这个额外的关键字。故可以在插入排序开始之前,先进行一遍选择排序将待排元素的最值找出并当作观察哨。
在平均情况下,插入排序使用大概N^2/4次比较操作和N^2/4次交换(移动)操作。
插入排序的运行时间和输入文件的原始顺序密切相关。
3.冒泡排序
程序该进: 增加标志位测试文件时候已序,提前跳出循环。(提高的效率赶不上中断内部循环的插入排序)
在平均情况和最坏情况下,冒泡排序的执行大约N^2/2次比较操作和N^2/2次交换(移动)操作。
文件中一对顺序不对的元素称为一个逆序。在插入排序中,总逆序数就是元素要插入文件时所要向前移动的步数。对于逆序为线性规模的序列,插入排序和冒泡排序有着线性的效率
总结:以上三种基本的排序方法,对基本有序的文件进行排序时才能体现插入排序和冒泡排序的效率。
我们需要分析比较和交换操作的相对开销,而该特性与元素和关键字的大小有关。
4.希尔排序
希尔排序法是插入排序的拓展。希尔排序关键是要使用一个性能较好的步长序列。
如果需要快速解决问题,而且不涉及系统排序,使用希尔排序法是个不错的选择。