时间复杂度:O(n log n)

    • 最好:O(n log^2 n)
    • 最坏:O(n log^2 n)

    空间复杂度:O(1)

    • 只需要一个额外空间用于数据交换

    原理
    希尔排序(Shell Sort)是一个不稳定排序,它的基本思想是:
    先取定一个小于序列元素个数的整数作为增量,把序列的全部元素分成增量个组,所有相互之间距离为增量整数倍的元素放在同一个组中,在各组内进行直接插入排序。

    实现

    1. 将一个数据序列按照增量进行分组。
    2. 将各个分组的数据进行直接插入排序。
    3. 更新增量,同时增量大于零在进行分组并排序。
    1. // 希尔排序,降序不稳定排序
    2. func ShellSort(slice []int) []int {
    3. if len(slice) < 2 {
    4. return slice
    5. }
    6. for gap := len(slice) >> 1; gap > 0; gap >>= 1 {
    7. for i := gap; i < len(slice); i++ {
    8. for j := i; j >= gap && slice[j] > slice[j-gap]; j -= gap {
    9. slice[j], slice[j-gap] = slice[j-gap], slice[j]
    10. }
    11. }
    12. }
    13. return slice
    14. }