zoukankan      html  css  js  c++  java
  • 希尔排序

    介绍

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

    过程

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

  • 相关阅读:
    分梨
    18岁生日
    马的移动
    摆积木
    杭电2093考试排名
    栈的应用——四则运算表达式求值
    用指针实现对二维数组元素的访问
    用多种方法访问字符数组元素
    fread()函数和fwrite()函数进行文件操作
    hdu-1431 素数回文
  • 原文地址:https://www.cnblogs.com/bluebean/p/5838972.html
Copyright © 2011-2022 走看看