希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。
基本思想
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
该算法对广泛传播的元素使用插入排序,首先对它们进行排序,然后对较宽的间隔元素进行排序。该间隔称为间隔。该间隔是基于Knuth公式计算的,
Knuth的公式
h = h * 3 + 1
where −
h is interval with initial value 1
该算法对于中型数据集是非常有效的,因为其平均和最差情况复杂度为Ο(n),其中n是项目数。
package sort
func ShellSort(list []int) ([]int, int) {
count := 0
for gap := len(list) / 2; gap > 0; gap /= 2 {
for i := gap; i < len(list); i++ {
for j := i; j-gap >= 0 && list[j] < list[j-gap]; j -= gap {
count++
swap(list, j, j-gap)
}
}
}
return list, count
}
func swap(arr []int, a int, b int) {
arr[a] = arr[a] + arr[b]
arr[b] = arr[a] - arr[b]
arr[a] = arr[a] - arr[b]
}