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

    1. 希尔排序

    希尔排序(Shell Sort),也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。详情见维基百科

    我们使用插入排序时,希望待排序列具有以下特性:

    • 待排序列部分有序
    • 序列较短

    而对于随机无序序列,插入排序时间复杂度为O(n2)

    希尔排序是基于插入排序的以下两点性质而提出改进方法的:

    • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
    • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位
    希尔排序
    Step-by-step visualisation of Shellsort
    以23, 10, 4, 1的步长序列进行希尔排序。
    分类 排序算法
    数据结构 数组
    最坏时间复杂度 根据步长序列的不同而不同。已知最好的:O(nlog^2 n)
    最优时间复杂度 O(n)
    平均时间复杂度 根据步长序列的不同而不同。
    最坏空间复杂度 O(n)

     
    2. 希尔排序C++ 实现
    #include<iostream>
    #include<vector>
    using namespace std;
    
    void ShellSort(vector<int> &array){
        int h = 1;
        // 递增序列 1, 4, 13, 40, ...
        while(h < array.size()/3)
            h = 3 * h + 1;
    
        while(h >= 1){
            for(int i = h; i < array.size(); i++){
                for(int j = i; j >= h; j -= h){
                    if(array[j] < array[j-h])
                        swap(array[j], array[j-h]);
                }
            }
            h = h / 3;
        }
    }
    
    
    int main(int argc, char const *argv[])
    {
        vector<int> a1 = {5, 9, 0, 1, 3, 6, 4, 8, 2, 7};
        ShellSort(a1);
        for(auto &it : a1)
            cout<<it<<' ';
        cout<<endl;
    
        return 0;
    }

     点击此处查看常用排序算法

  • 相关阅读:
    查看Linux内核版本命令
    身份证测试用
    aaa
    aaaaaaaaaaaaaaa
    https
    httpclient调用https
    共阴极数码管编码
    时间单位换算
    Java 中System里getProperty(something)
    VM arguments
  • 原文地址:https://www.cnblogs.com/iwangzhengchao/p/10009886.html
Copyright © 2011-2022 走看看