My Profile Photo

Justin Chou


人生的奇妙在于,将不可能变成可能。


排序(二)—— 希尔排序

希尔排序的基本思想
把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入排序;小组的个数逐次缩小;当完成了所有数据元素都在一个组内的排序后,排序过程结束。希尔排序又称做缩小增量排序。

实现方法

for m in 0..<spanArray.count {

    let span = spanArray[m]
    for k in 0..<span {
        
        for i in k..<(array.count - span) {
            let temp = array[i + span]
            var j = i
            if j > -1 && temp <= array[j] {
                (array[j + span], array[j]) = (array[j], array[j + span])
                j = j - span
            }
        }
    }
}

理解
每次分组是根据增量来进行分组。例如3为增量,一组的数分别是数组中序号分别为 1 4 7…… 这是一个从疏到密的过程,最后一个增量必然是1。个人的理解是,每次进行分组直接排序后,相对小的数排列会靠前,大的数则靠后。到最后一次排序时大多数的元素已经是有序的了。当需要排序的数组中元素是接近有序的,那么直接插入排序的时间效率是接近好的。