希尔排序

来源:互联网 发布:手机淘宝怎么改中评 编辑:程序博客网 时间:2024/05/22 07:07

  希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。

基本思想

  希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

该算法对广泛传播的元素使用插入排序,首先对它们进行排序,然后对较宽的间隔元素进行排序。该间隔称为间隔。该间隔是基于Knuth公式计算的,

Knuth的公式

h = h * 3 + 1where −   h is interval with initial value 1

该算法对于中型数据集是非常有效的,因为其平均和最差情况复杂度为Ο(n),其中n是项目数。

package sortfunc 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]}
原创粉丝点击