理解希爾排序

2022-02-04 03:44:41 字數 602 閱讀 7554

最近回顧了一下the c programming language,其中提到了乙個用來演示 for 迴圈的小例子,如下:

/** shell sort */

void shellsort(int, int);

int main()

; int b = ;

shellsort(b, 10);

}void shellsort(int v, int n)}}

}

這是乙個希爾排序的例子,以每次 n/2 為步長,比較步長兩邊的元素的大小,步長是從大到小的,也就是說,一開始直接比較相距較遠的兩個元素,如果是逆序,則直接交換,比基於相鄰比較的排序(氣泡排序,交換排序)跨越了更多的中間位置;然後最終步長為1能夠保證所有元素都能正確被排序。步長為1時,退化為交換排序,但是其實這時序列是已經經過排序的,所以要比一開始就用交換排序要好。

希爾排序是第一批跨越 o(n2) 複雜度的排序演算法之一。它是一種不穩定的排序演算法,其效能與步長的取值有很大關係,wikipedia上有關於各種步長選擇下的效能比較:shellsort#gap_sequences。

ps - 個人部落格原文:理解希爾排序

希爾排序理解

插入排序的 演算法複雜度為o n2 但如果序列為正序可提高到o n 而且直接插入排序演算法比較簡單,希爾排序利用這兩點得到了一種改進後的插入排序。希爾排序 將無序陣列分割為若干個子串行,子串行不是逐段分割的,而是相隔特定的增量的子串行,對各個子串行進行插入排序 然後再選擇乙個更小的增量,再將陣列分割...

希爾排序的理解

希爾排序是插入排序的一種高效演算法,遞增量排序。我理解為步數排序 因為每次進行一次迴圈的時候,會給這次迴圈乙個跨度 也就是你一次能邁多少步 void sort int a,int length int step 0 這個while迴圈,目的是找出對於當前陣列下,最大的步數,也就是最多能擴多少,到最後...

希爾排序的理解

public static void shellsort int arr int j int temp for int gap arr.length 2 gap 0 gap 2 for int i gap i 這裡的 i gap就是插入排序的第二個數,j就是第乙個位置的數,i之所以是加一也要理解,當...