希尔排序

Posted bluebean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了希尔排序相关的知识,希望对你有一定的参考价值。

介绍

先将整个待排序的记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

过程

先将要排序的一组记录按某个增量d(n/2,n为要排序数的个数)分为若干组子序列,每组中记录的下标相差d。对每组中全部元素进行直接插入排序;

然后再用一个较小的增量(d/2)对它进行分组,在每组中再进行直接插入排序。继续不断缩小增量直至为1;

最后使用直接插入排序完成排序。

代码

#include<iostream>
using namespace std;
void ShellInsertSort(int a[],int n,int dk){
    for (int i = dk; i < n; i++){
        //若第i个元素大于第i-1个元素,直接插入。小于的话,移动有序表后插入。
        if (a[i] < a[i - dk]){
            int j = i - dk;
            int x = a[i];//赋值为哨兵,即存储待排序元素
            a[i] = a[i - dk];//首先后移一个元素
            //查找在有序表中的插入位置
            while (x < a[j]){
                a[j + dk] = a[j];
                j -= dk;//元素后移
            }
            a[j + dk] = x;//插入到正确位置
        }
    }
}
void shellSort(int a[], int n){
    int dk = n / 2;
    while (dk >= 1){
        ShellInsertSort(a,n,dk);
        dk = dk / 2;
    }
}
int main(){
    int a[] = { 3, 1, 5, 7, 2, 4, 11, 32, 5, 6 };
    int n = 10;
    shellSort(a, n);
    for (int i = 0; i < n; i++){
        cout << a[i] << " ";
    }
    return 0;
}

时间复杂度

分析较难,比O(n*n)好,大概在O(n^1.25)

空间复杂度

O(1)

以上是关于希尔排序的主要内容,如果未能解决你的问题,请参考以下文章

希尔排序

插入排序(直接插入排序折半插入排序希尔排序的算法思想及代码实现)

希尔排序图解与代码

算法-java代码实现希尔排序

希尔排序JAVA代码

《算法》笔记 3 - 选择排序插入排序希尔排序