希尔排序(shell Sort)
- 平均时间复杂度:O(nlogn)
- 最好情况:O(nlogn)
- 最坏情况:O(nlogn)
- 空间复杂度:O(1)
- 排序方式:内部
- 稳定性:稳定
C++代码实现
void shellSort(vector<int>& arr) {int len = arr.size();int gap = 1; //增量间隔while (gap < len / 3) {gap = 3 * gap + 1;}while (gap >= 1) {//此处是插入排序的改进(根据gap间隔进行插入排序)for (int i = gap; i < len; i++) {for (int j = i; j >= gap && arr[j] < arr[j - gap]; j -= gap) {swap(arr[j], arr[j - gap]);}}gap = gap / 3;}}
1. 算法步骤
- 选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
- 按增量序列个数 k,对序列进行 k 趟排序;
- 每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。
- 仅增量因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。
优化步骤
① 希尔排序是插入排序的改进,所以可以使用插入排序的优化2. 动图演示

