• 希尔排序


    介绍

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

    过程

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

  • 相关阅读:
    Spark提交任务到集群
    在Spark中使用Kryo序列化
    Linux用户与用户组的详解
    Linux一键安装PHP/JAVA环境OneinStack
    Redis常用命令
    MySQL高效分页解决方案集
    linux 发邮件
    Linux 安全
    Linux Shell 文本处理工具集锦
    MySQL 获得当前日期时间(以及时间的转换)
  • 原文地址:https://www.cnblogs.com/bluebean/p/5838972.html
Copyright © 2020-2023  润新知