1. 程式人生 > >最詳細的希爾排序,shell排序方法,一步一步除錯

最詳細的希爾排序,shell排序方法,一步一步除錯

C程式設計語言摘來的,其基本思想是:先比較距離遠的元素,而不是像簡單交換排序演算法那樣先比較相鄰的元素,這樣可以快速減少大量的無序情況,從而減輕後續的工作。被比較的元素之間的距離逐步減少,直到減少為1,這時的排序變成了相鄰元素的互換。

void shellsort(int v[],int n)
{
    int gap,i,j,temp;
    for (gap = n/2; gap > 0; gap /= 2)
    {
        for(i = gap; i < n; i++)

            for(j = i-gap; j>=0 && v[j]>v[j+gap]; j -= gap)
            {
                temp = v[j];
                v[j] = v[j+gap];
                v[j+gap] = temp;
            }           

    }
}

int
main() { int s[] = {9,6,3,4,5,7}; shellsort(s,sizeof(s)/sizeof(int)); for (int i=0;i<sizeof(s)/sizeof(int);i++) { cout<<s[i]<<" "; } return 0; }

開始: 9 6 3 4 5 7

一、 n = 6, gap = 3
在進入第三層for迴圈,j = 0; 比較v[0] 和 v[3] (v[j] 和 v[j+gap])的大小,如果前者大,就互換。 9 與 4進行了互換。

經 j -= gap 後,不在滿足條件,返回第二層迴圈。 i++ 後,進入第三層迴圈, j = 1; 比較v[1] 和 v[5] 的大小。 6 與 5 進行了互換。第三次麼有互換。

這裡寫圖片描述

這裡寫圖片描述

表述總不如圖片來的更快!!!

經過此時的排序: 4 5 3 9 6 7

二、返回首個for迴圈,gap /= 2, 此時 gap = 1; 按照一步驟 4 和 5 不用互換。

在比較 3 和 5 互換後為 4 3 5 9 6 7 ,此時 j -= gap ,j = 0, 這時候滿足第三層for迴圈測試條件會向前比較 4 和 3 的值(不信你除錯看看), 3 4 5 9 6 7, 後面就是 9 和 6 互換, 9 和 7 互換。

這裡寫圖片描述
結束