排序---希爾排序

1. 希爾排序html

希爾排序(Shell Sort),也稱遞減增量排序算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序算法。詳情見維基百科ios

咱們使用插入排序時,但願待排序列具備如下特性:算法

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

而對於隨機無序序列,插入排序時間複雜度爲O(n2)shell

希爾排序是基於插入排序的如下兩點性質而提出改進方法的:數組

  • 插入排序在對幾乎已經排好序的數據操做時,效率高,便可以達到線性排序的效率
  • 但插入排序通常來講是低效的,由於插入排序每次只能將數據移動一位
希爾排序
Step-by-step visualisation of Shellsort
以23, 10, 4, 1的步長序列進行希爾排序。
分類 排序算法
數據結構 數組
最壞時間複雜度 根據步長序列的不一樣而不一樣。已知最好的:O(n\log^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;
}

 點擊此處查看經常使用排序算法數據結構

相關文章
相關標籤/搜索