希爾排序(shell sort)又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。
對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知:如果資料的本身就是有序的或者本身基本有序,那麼效率就會得到提高。
希爾排序的基本思想是:將需要排序的序列劃分成為若干個較小的子串行,對子序列進行插入排序,通過則插入排序能夠使得原來序列成為基本有序。這樣通過對較小的序列進行插入排序,然後對基本有序的數列進行插入排序,能夠提高插入排序演算法的效率。
在希爾排序中首先解決的是子串行的選擇問題。對於子串行的構成不是簡單的分段,而是採取相隔某個增量的資料組成乙個序列。一般的選擇原則是:去上乙個增量的一般作為此次序列的劃分增量。首次選擇序列長度的一般為增量。
先假如:陣列的長度為10,陣列元素為:25,19,6,58,34,10,7,98,160,0
整個希爾排序的演算法過程如下如所示:
上圖是原始資料和第一次選擇的增量 d = 5。本次排序的結果如下圖:
上圖是第一次排序的結果,本次選擇增量為 d=2。 本次排序的結果如下圖 (
注意:相同顏色下(黑色)的資料從後向前依次比較):
當d=1 是進行最後一次排序,本次排序相當於氣泡排序的某一次迴圈。最終結果如下:
在實際使用過程中,帶排序的資料肯定不是只有十個,但是上述是希爾排序的思想。其實希爾排序只是插入排序的一種優化。
希爾排序的整個流程如下圖所示:假設帶排序的資料結構為整型陣列 a[n] 陣列長度為 n
c++實現希爾排序的**如下所示:
//#include "stdafx.h"
#include
using namespace std;
void display(int array,int length);
void shellsort(int array,int length);
int main(int argc, char* argv)
;display(arr,10);
shellsort(arr,10);
display(arr,10);
system("pause");
return 0;
}//輸出陣列
void display(int array,int length)
cout
//希爾排序演算法的實現
void shellsort(int array,int length)
array[j+d] = temp;
}display(array,10);
d= d/2; //縮小增量}}
排序演算法之希爾排序
希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...
排序演算法之希爾排序
希爾排序,突破了 通過交換相鄰元素進行排序的任何演算法平均需要 n 2 的二次時間限制 通過比較相距一定間隔的元素來工作。使用乙個增量序列 h1 1,h2,ht,在使用乙個 增量h的一趟排序後,對於每乙個i滿足pdata i pdata i h 即此時序列是h排序的 各趟 比較所用的距離逐漸減小,直...
排序演算法之希爾排序
設待排元素序列有 n 個,首先取乙個整數ga p ga p作為間隔,將全部元素分為ga p 個子序列,所有距離為ga p 的元素放在同乙個子串行中,在每乙個子串行中分別進行直接插入排序。然後縮小間隔ga p 重複上述的子串行劃分和排序工作。知道最後ga p 等於1時,將所有元素放在同乙個序列中排序為...