排序之希尔排序
2018 algorithm希尔排序,也可以叫“缩小增量排序”,可以看作插入排序的概括。
基本思想:先将序列按增量分割成若干序列,然后分别进行插入排序。然后降低增量再进行排序。最后增量降低为1时,对全体记录进行插入排序。
- 希尔排序是一种不稳定的排序方法。
- 希尔排序的时间复杂度最坏的情况为 O(n2),优化可以提高。
- 希尔排序的空间复杂度为 O(1)。
增量序列(Gap sequences)
增量序列有很多。增量序列都是已经排序好的序列。有一些比较常见的增量序列,设N为数组的长度:
增量序列(k >= 1) | 具体增量 | 最坏的时间复杂度 | 作者与时间 |
---|---|---|---|
⌊ N / 2k ⌋ | ⌊ N / 2 ⌋, ⌊N / 4⌋, …, 1 | O(n2) | Shell 1959 |
2k - 1 | 1, 3, 7, 15, 31, 63, … | O(n3/2) | Hibbard 1963 |
2p3q的连续数字 | 1, 2, 3, 4, 6, 8, 9, 12, … | O(N log2N) | Pratt 1971 |
希尔排序的伪代码:
// 设置增量gap, 并逐步减少增量
gap ← ⌊length(Arr)/2⌋
WHILE gap > 0
i ← gap
// 从第gap个元素,逐个对其所在组进行直接插入排序操作
WHILE i < length(Arr)
minIndex ← i
WHILE minIndex >= gap and arr[minIndex] < arr[minIndex - gap]
// 交换最小值的位置
swap arr[minIndex] and arr[min - gap]
minIndex ← minInde - gap
END WHILE
i ← i+1
END WHILE
gap ← ⌊gap/2⌋
END WHILE