希尔排序 Shell Sort
原理
希尔排序(Shell Sort)是一种基于插入排序的改进排序算法,它通过逐步减少排序的增量(或称间隔)来提升效率。它由计算机科学家 Donald Shell 于 1959 年首次提出,因此得名。
其具体步骤如下:
- 分组: 将数组按照一定的间隔分成多个子序列,分别对每个子序列进行插入排序。
- 缩小间隔: 每次排序完成后,将间隔逐步缩小(通常按某种递减序列,例如减半或更复杂的公式),重复对子序列排序。
- 最终排序: 当间隔缩小到1时,整个数组就成为一个普通的插入排序。
示例
有一组无序数组:
6 | 2 | 4 | 11 | 9 | 0 | 3 | 1 | 10 | 5 |
---|
取数组长度10
的一半并向下取整得到5
作为相同序列元素的间隔。
此时有以下几个序列:6
0
,2
3
,4
1
,11
10
,9
5
。
从前往后对每个序列进行从后往前的插入排序:
6
比0
大,向后移位,已到达数组尽头,将0
插入
3
比2
大,3
原位插入
4
比1
大,向后移位,已到达数组尽头,将1
插入
11
比10
大,向后移位,已到达数组尽头,将10
插入
9
比5
大,向后移位,已到达数组尽头,将5
插入
此时间隔为5
的数组排序完成。
取上回间隔5
的一半并向下取整得到2
作为相同序列元素的间隔。
此时有以下几个序列:0
1
5
3
11
,2
10
6
4
9
。
从前往后对每个序列进行从后往前的插入排序:
1
比0
大,1
原位插入
10
比2
大,10
原位插入
5
比1
大,5
原位插入
10
比6
大,向后移位;6
比2
大,将6
插入
5
比3
大,向后移位;3
比1
大,将3
插入
此时间隔为2
的数组排序完成。
取上回间隔2
的一半并向下取整得到1
作为相同序列元素的间隔。
此时仅剩一个序列:0
2
1
6
3
10
5
4
11
9
。
0 | 2 | 1 | 6 | 4 | 10 | 5 | 4 | 11 | 9 |
---|
从前往后进行从后往前的插入排序:
2
比0
大,2
原位插入
1 | 6 | 3 | 10 | 5 | 4 | 11 | 9 |
---|
2
比1
大,向后移位;1
比0
大,将1
插入
6 | 3 | 10 | 5 | 4 | 11 | 9 |
---|
6
比2
大,6
原位插入
3 | 10 | 5 | 4 | 11 | 9 |
---|
6
比3
大,向后移位;3
比2
大,将3
插入
10 | 5 | 4 | 11 | 9 |
---|
10
比6
大,10
原位插入
5 | 4 | 11 | 9 |
---|
10
比5
大,向后移位;6
比5
大,向后移位;5
比3
大,将5
插入
4 | 11 | 9 |
---|
10
比4
大,向后移位;6
比4
大,向后移位;5
比4
大,向后移位;4
比3
大,将4
插入
11 | 9 |
---|
11
比10
大,11
原位插入
9 |
---|
11
比9
大,向后移位;10
比9
大,向后移位;9
比6
大,将9
插入
排序完成。
实现
C++
cpp
可视化
数组长度
动画间隔
数组:
[]