• 希尔排序


    介绍

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

    过程

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

  • 相关阅读:
    DOM 获取元素,设置样式
    js检查浏览器内核版本信息
    获取浏览器可视屏幕宽度
    swift 闭包+嵌套函数+extension+单例+嵌套函数+??
    HTTP请求错误大全
    Swift:网络库Alamofire
    Swift 值类型和引用类型
    Swift URL Schemes使用
    Swift编程规范
    swift系统学习控件篇:UITableView+UICollectionView
  • 原文地址:https://www.cnblogs.com/bluebean/p/5838972.html
Copyright © 2020-2023  润新知