排序 希爾排序

2021-06-08 14:28:18 字數 1637 閱讀 3906

希爾排序(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)

array[j+d] = temp;

}display(array,10);

d= d/2; //縮小增量

}}/*希爾排序是對插入排序的一種改進。該演算法思路和**都比較複雜。以上**在vc 6.0 中成功執行*/

排序 希爾排序

縮小增量排序 待排序列按關鍵字基本有序時,直接插入排序的效率很高 希爾排序思想 將整個待排記錄分割為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序,就可以完成整個排序工作 增量序列中的值沒有除1以外的公因子,且最後乙個增量必須等於1 子串行的構成不是逐...

排序 希爾排序

希爾排序是插入排序中的乙個分支,但是較簡單插入排序又有較大的改進,這使得它成為了歷史上第一批突破二次時間屏障的排序演算法之一哦。它是通過比較一定間隔的元素來工作的。因此希爾排序又稱為縮小增量排序。直接插入排序對於原始資料基本有序的情況下,效率較高。在此的基礎上。我們可以想辦法,使資料基本有序,然後利...

排序 希爾排序

希爾排序又稱為 縮小增量排序 是由希爾在1959年提出的。希爾排序是對插入排序的一種改進,在效率上較直接插入,冒泡,選擇排序方法有較大改進。基本思想 設定乙個元素間隔增量gap,將參加排序的序列按這個間隔數gap從第1個元素開始依次分成若干個子串行。例如最開始gap 3,下面的序列可這樣劃分 原序列...