排序---希爾排序
阿新 • • 發佈:2018-11-23
1. 希爾排序
希爾排序(Shell Sort),也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。【詳情見維基百科】
我們使用插入排序時,希望待排序列具有以下特性:
- 待排序列部分有序
- 序列較短
而對於隨機無序序列,插入排序時間複雜度為O(n2)
希爾排序是基於插入排序的以下兩點性質而提出改進方法的:
- 插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率
- 但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位
以23, 10, 4, 1的步長序列進行希爾排序。 | |
分類 | 排序演算法 |
---|---|
資料結構 | 陣列 |
最壞時間複雜度 | 根據步長序列的不同而不同。已知最好的: |
最優時間複雜度 | O(n) |
平均時間複雜度 | 根據步長序列的不同而不同。 |
最壞空間複雜度 | O(n) |
2. 希爾排序C++ 實現
#include<iostream> #include<vector> usingnamespace 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; }