希尔排序

介绍

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

过程

先将要排序的一组记录按某个增量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)

posted @ 2016-09-04 12:00  bluebean  阅读(347)  评论(0编辑  收藏  举报