1. 程式人生 > >排序---希爾排序

排序---希爾排序

1. 希爾排序

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

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

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

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

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

  • 插入排序在對幾乎已經排好序的資料操作時,效率高,即可以達到線性排序的效率
  • 但插入排序一般來說是低效的,因為插入排序每次只能將資料移動一位
希爾排序
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; }