package Sort
import (
"fmt"
"testing"
)
func ShellSort(arr []int){ //插入排序的变种
for step := len(arr) / 2; step > 0; step /= 2 { //外层步长控制
for i := step; i < len(arr); i++ { //开始插入排序
for j := i - step; j >= 0 && arr[j+step] < arr[j]; j -= step { //满足条件则插入
Swap(arr,j,j+step)
}
}
}
}
func TestShellSort(t *testing.T) {
arr:=[]int{9,8234,23,0,34,123,58}
ShellSort(arr)
fmt.Println(arr)
}
解析:
- 初始步长为数组长度减半
- 按步长的间隔进行分组,对组内的元素进行插入排序,使得同组内元素有序。
- 步长不断减半,在步长大于0的情况下重复 1。
步长为1时,全部元素都在同一组,插入排序后自然有序。