以前學資料結構的時候,因為老師的時間問題,導致這個演算法沒講,今天有人問我這個演算法問題,然後下去查了一下資料,把這個演算法終於弄明白了,這個演算法就是將乙個陣列,
先確定乙個步長,一般為陣列大小的一半,然後將間距每個步長對應的兩個數字,從頭到尾的進行比較。因為我們是從小到大,那麼就是如果前面的數如果比後面的數大就將他們兩進行置換,每個數都進行同一步長的比較之後,接下來就縮小步長,將現在的步長縮小為原來步長的一半,然後在重複上述步驟,將每個步長間距的數進行比較置換,直到步長為0,演算法排序完畢。
下面我們看一張圖,可以更加清楚的明白希爾排序的原理
看到這個圖,我們可以清楚的看到第一趟排序的結果,和第二趟排序的結果。
現在原理都弄懂了,可是要想轉化問程式,可得下一番功夫。
下面是我借鑑乙個人寫的c語言**,加上我自己的理解之後,寫的**,大家可以看一下。
#include
void shell_sort(int arr,int size)
arr[front+step]=temp;
} }for(step=0;step
step++) }
void main()
; shell_sort(arr,9);
}
如果看不懂的,我下面進行解釋一下:首先是最外面的迴圈,那是確定我們的步長,直到步長為0排序就算結束。
裡面第一重迴圈就是在把每個確定步長的間距的兩個數進行比較排序,此時就是從對應的後面的那個數往前進行比較置換,在從中間往後走的過程中,裡面又套了一層迴圈,這個就是真正的要比較置換的程式了。看著**和圖我們就會慢慢明白了。
選擇排序 C語言版
先說說選擇排序的思想 每一趟從待排序的資料元素中選出最小 或最大 的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。穩定性和複雜度 選擇排序是不穩定的排序演算法,時間複雜度最壞為o n2 平均為o n2 空間複雜度為o 1 下面是我用c語言實現的選擇排序的源 如果有什麼不對的地...
氣泡排序(C語言版)
氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。它的變化過程如下圖 下面我們用 實現 include includeint main for j 0 j 9 j...
桶排序C語言版
桶排序 bucket sort 是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不是 比較排序,它...