排序成本模型
在研究排序算法时,我们需要计算 比较 和 交换 的数量,对于不交换元素的算法,计算访问数组的次数
选择排序
1、找到最小的,和第一个元素交换位置
2、然后找到第二小的,和第二个元素交换位置,如此反复,直到整个数组排序
比较次数 | 交换次数 |
---|---|
N 2 2 \frac{N^2}{2} 2N2 | N N N |
特点:
- 运行时间和输入无关
- 数据移动最少
插入排序
情况 | 比较次数 | 交换次数 |
---|---|---|
平均 | N 2 4 \frac{N^2}{4} 4N2 | N 2 4 \frac{N^2}{4} 4N2 |
最坏 | N 2 2 \frac{N^2}{2} 2N2 | N 2 2 \frac{N^2}{2} 2N2 |
最好 | N − 1 N - 1 N−1 | 0 |
特点:
- 对部分有序且小规模的数组十分高效
对于随机排序的无重复主键的数组,插入排序和选择排序的运行时间是平方级别的,两者之比是一个较小的常数。1980年,插入排序比选择排序快1倍,现在仍然是这样
希尔排序
基于插入排序的快速的排序算法,它的思想是使数组中任意间隔为 h 的元素都是有序的 —— h 有序数组,h 个互相独立的有序数组编织在一起组成的一个数组。
希尔排序更高效的原因是它衡量了子数组的规模和有序性。排序之初,各个子数组都很短,排序之后子数组都是部分有序的,这两种情况都很适合插入排序。算法的性能不仅取决于h,还取决于h之间的数学性质。
在实际应用中,h 序列使用: h = 3 ∗ h + 1 h = 3* h + 1 h=3∗h+1 的递增序列基本就足够了。透彻理解希尔排序的性能至今仍然是一项挑战。
希尔排序比插入排序和选择排序都要快得多,而且数组越大,优势越大。已知在最快情况下,递增序列为 3 ∗ h + 1 3 * h + 1 3∗h+1的希尔排序的比较次数和 N 3 2 N^\frac{3}{2} N23 成正比
通过提升速度来解决其他方式无法解决的问题是研究算法的设计和性能的主要原因之一