问题描述:
希尔排序是一种递减增量的排序算法,是插入排序的一种更高效的版本。但希尔排序是非稳定排序算法。希尔排序是指先将待排序的记录序列分割为若干子序列直接进行插入排序,待整个序列记录“基本有序”时,在对全体序列进行依次插入排序
步骤:
1. 选择一个增量序列t1, t2, ..., tk, 其中ti>tj, tk=1;
2. 按增量序列个数 k,对序列进行 k 趟排序;
3. 每次排序,根据对应的增量ti,将待排序分割成若干长度为m的子序列,分别对各个字表进行直接插入排序。仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
package main
import "fmt"
func main() {
arr := shellSort([]int{1, 3, 4, 2, 6})
fmt.Printf("shell sort result %v", arr)
}
func shellSort(arr []int) []int {
length := len(arr);
var temp int
gap := 1
for gap < length / 3 {
gap = gap * 3 + 1
}
for gap > 0{
for i := gap; i < length; i++ {
temp = arr[i]
j := i - gap
for j >= 0 && arr[j] > temp {
arr[j + gap] = arr[j]
j -= gap
}
arr[j+gap] = temp
}
gap = gap / 3
}
return arr
}