# 希尔排序
TIP
希尔排序是对插入排序的一种优化,在掌握希尔排序之前,要提前掌握插入排序
# 分组原理图
# 代码实现
function shellSort(data){
let tempData = data
let len = tempData.length
// 按照数组总数量的一半进行分组
for (let groupNumber = parseInt(len >> 1); groupNumber >=1; groupNumber=parseInt(groupNumber >> 1)) {
// 根据最外层所定的分组方案进行分组,其余逻辑和插入排序一样
for (let i = groupNumber; i < tempData.length; i++) {
let next = i - groupNumber
if(arr[i]<arr[next]){
let temp = arr[i]
while(next>=0 && temp<arr[next]){
arr[next+groupNumber] = arr[next]
next-=groupNumber
}
arr[next+groupNumber] = temp
}
}
}
return tempData
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 解析
- 重点理解最外层的分组方案,分组的实现是对数组的索引进行定额增加实现的,(定额:最外层的分组方案,即groupNumber)
- 内层排序逻辑还是插入排序的逻辑,只不过插入排序每次的比较是和前一个索引值进行比较,希尔排序变成了和当前分组的前一个值进行比较
- 只要理解了分组的逻辑思维,加上插入排序的是为就很简单了