希爾排序
阿新 • • 發佈:2017-05-11
shells 思想 .com 復雜度 i++ 排序。 算法 時間復雜度 -1
在第一篇博客中論述了幾種排序的方法,這裏再論述一下另外一種排序方法:希爾排序
希爾(Shell)排序又稱為縮小增量排序,它是一種插入排序。它是直接插入排序算法的一種威力加強版。
希爾排序的基本思想是:
把記錄按步長 gap 分組,對每組記錄采用直接插入排序方法進行排序。
隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到 1 時,整個數據合成為一組,構成一組有序記錄,則完成排序。
如下圖所示:
因此,增量的選擇很重要,如果增量的選擇不合適,時間復雜度依然很高。
代碼實現如下:
#include<iostream> using namespace std; int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15}; //書上的版本 void Shellsort(int A[], int N) { int i, j, Increment; int Tmp; for(Increment = N / 2; Increment > 0; Increment /= 2 ) //增量的變換 { for (i = Increment; i < N; i++) { Tmp = A[i]; for(j = i; j >= Increment; j -= Increment) if(Tmp < A[j - Increment]) A[j] = A[j - Increment]; else break; A[j] = Tmp; } } } //我自己寫的版本 void My_Shellsort(int A[], int N) { int i, j; int Increment = N / 2; int Tmp; while(1 <= Increment) { for(i = Increment; i < N; ++i) { Tmp = A[i]; for(j = i - Increment; j >= 0 && Tmp < A[j]; j = j - Increment) { A[j + Increment] = A[j]; } A[j + Increment] = Tmp; } Increment = Increment / 2; } } int main () { //Shellsort(A, 13); My_Shellsort(A, 13); for(int i = 0; i != 13; ++i) { cout << A[i] << " "; } cout << endl; return 0; }
希爾排序相當於改進版本的插入排序。
夜深了,,,
我還要預見幾個你,才可以忘記你。
希爾排序