You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
# 希尔排序
|
|
|
|
|
|
|
|
* **介绍**
|
|
|
|
* 定义
|
|
|
|
* 希尔排序是一种分组插入排序算法。
|
|
|
|
* 复杂度 比较多类别,复杂度不一
|
|
|
|
* 过程:
|
|
|
|
* 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
|
|
|
|
* 插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
|
|
|
|
* 关键字:
|
|
|
|
* 插入排序
|
|
|
|
* 缩小增量排序
|
|
|
|
* **原理**
|
|
|
|
* 按下标的一定增量分组 ,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;
|
|
|
|
* 然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。
|
|
|
|
|
|
|
|
* **代码**
|
|
|
|
|
|
|
|
```go
|
|
|
|
func main(){
|
|
|
|
for d := len(a); d >= 1; d = d/2 {
|
|
|
|
Shell(a, d)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
Shell 实现希尔排序 O(n * n)
|
|
|
|
a : 被排序数组
|
|
|
|
返回:排序完毕数组
|
|
|
|
*/
|
|
|
|
func Shell(s []int, get int) {
|
|
|
|
n := len(s)
|
|
|
|
if n < 2 {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
for i := get; i < n; i++ {
|
|
|
|
for j := i; j > 0 && s[j] < s[j - get]; j = j - get {
|
|
|
|
// 选择第j张比较第j - get张小,则循环交换较大的值
|
|
|
|
s[j], s[j - get] = s[j - get], s[j]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|