演算法基礎 希爾排序

2021-06-20 17:25:36 字數 1686 閱讀 1420

一、希爾排序

希爾排序,也稱也稱

遞減增量排序演算法

,它是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。【來自維基百科】

下面直接以乙個例子來說明吧!例如,乙個陣列a=為例,個數n=10。

第一次 步長gap= n/2= 10/2 = 5

這樣原來的陣列可以被劃分為,,,,

之後對每個劃分以插入排序的形式互換位置,於是有,,,,,將這些劃分對應到a中的位置(如,13和49互換了位置,38和27互換位置,其實就是這些劃分原先的數值位置保持不變,只是在劃分的組內部進行位置互換而已),

於是這次的排序為:

a1= ;

第二次 步長gap = 5/2 = 2

以步長為2對進行a1劃分,如從13開始,步長為2進行選擇,可以得到,接著以27開始,步長為2進行選擇,可以得到,接著再從49開始,可是這裡的49已經在前面的乙個劃分中,因此不需要進行了。於是我們就得到了兩個劃分。接著對這兩個劃分以插入排序形式排序,於是有和,將它們對應到a1排序後的數值位置,於是有這樣的排序:

a2=;

第三次 步長gap = 2/2 = 1

以步長為1對a2進行劃分,從4開始,步長為1進行選擇,可以得到,我們發現這是整個組都為乙個劃分,這樣我們對整個數值按插入進行排序,於是有:

a3=;

第四次 步長gap = 1/2 = 0,由於gap=0,表示排序已經結束

另外需要注意的是,插入排序又分為:直接插入排序、折半插入排序、2-路插入排序等,在下面的的實現中,我只是使用了直接插入排序!

二、演算法實現

// 希爾排序.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

void shellsort(int a, int n);

void insertsort(int a, int n, int gap) ;

void print(int a,int n);

void swap(int *x1, int *x2);

int _tmain(int argc, _tchar* argv)

; int array[n]= ;

//列印輸出

cout << "原始資料:" << endl;

print(array,n);

//排序

shellsort(array,n);

//列印輸出

cout <

print(array,n);

return 0;

}//希爾排序

void shellsort(int a, int n)

cout << "gap = " << gap <

a[k + gap] = temp;

} } void swap(int *x1, int *x2)

執行結果:

基礎演算法 希爾排序

直接插入排序就跟整理撲克牌一樣,每次把一張新的牌插入到已經排好序的牌的合適的位置中。陣列中排序的時候要將之前位置上的數字全部右移動乙個位置,空出來的位置再來放要插入的數字。可以一次性全部右移動乙個位置,也可以這樣,因為要插入的數字在已經排序的區間的右邊 如果要插入的數字左邊的數字比要插入的數字大,那...

基礎演算法 希爾排序

希爾排序,也稱遞減增量排序演算法,1959年shell發明。是插入排序的一種高速而穩定的改進版本。希爾排序是先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。1 設待排序元素序列有n個元素,首先取乙個整數increme...

Python演算法(基礎) 希爾排序

希爾排序 希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本,該方法的基本思想是 先將整個待排元素序列分割成若干個子串行 由相隔某個 增量 的元素組成的 分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序 增量足夠...