希尔排序(ShellSort) c源码
?希爾排序(Shell‘s Sort)其實是一種優化的插入排序,插入排序(insertSort)平均時間復雜度為O(n^2),僅僅比較時間復雜度的話,優于插入排序的還有很多其它排序方法,比如說堆排序或者歸并排序。很奇怪為啥現在算法里還介紹插入排序,考慮到它時間復雜度這么大,但書上也說了,如果數據量小的話,插入排序效率還是蠻高的。我覺得最重要一點是插入排序簡單,幾乎不需要思考就可以寫出來。
插入排序的平均時間復雜度為O(n^2),如果數據是正序(已經排好序)的話,可以為O(n)??梢钥吹皆绞桥藕眯虻臄祿?#xff0c;插入排序效率越高,希爾排序相較于插入排序優化的地方正在于此。它通過對原始數據集進行多次劃分子數據集,然后對子數據集進行插入排序,多次操作后,原始數據集逐漸變成有序的數據集,最后再來一次插入排序就行了。舉個例子:
數據集集合如下,共9個元素
9,3,4,7,5,2,10,8,16?希爾排序通過增量對數據集劃分,這里假設增量數組為5,3,1
第一次劃分得到{a0, a5}, {a1,a6},{a2, a7},{a3,a8}, {a4},對這五個子數據集進行插入排序得到如下:
2,3,4,7,5,9,10,8,16?第二次增量是3,劃分得到數據集為{a0, a3, a6}, {a1, a4, a7}, {a2, a5, a8},然后分別進行插入排序得到:
2,3,4,7,5,9,10,8,16?第三次增量是1,希爾排序最后的增量必須是1,相當于對整個數據集進行插入排序。這個時候我們可以看到,通過前兩次希爾排序得到的數據集基本已經有序,這時候再進行插入排序的話,相較于原始排序效率提高了不少。
這里給出的增量數據集是隨便給的,目前還沒有較好的方法明確的定義增量數據集。采用較多的增量有下面這個公式,也可以使用其它的公式,需要注意的是,最后一個增量必須是1:
...9, 5, 3, 2, 1 dlta[k] = 2^(t-k) + 1; 0 <= k <= t <= log(n-1) 其中t為排序趟數。下面是簡單的c語言希爾排序實現。?
void shellSort(int *arr, int numsSize, int *d, int size){ int i, k, v, j, m, n = 0;while (n < size){//遍歷增量k = d[n++];//對增量子數組排序for (i = 0; i < k; i++){//指向增量子數組第二個元素for (j = i + k; j < numsSize; j = j + k){if (arr[j] < arr[j-k]){v = arr[j];//在i, i+k,..,j之間找到合適位置并插入m = j - k;while(m >= 0 && arr[m] > arr[j]){arr[m + k] = arr[m];m -= k;}arr[m + k] = v; }}}}}=============================================================================================
Linux應用程序、內核、驅動、后臺開發交流討論群(745510310),感興趣的同學可以加群討論、交流、資料查找等,前進的道路上,你不是一個人奧^_^。
?
總結
以上是生活随笔為你收集整理的希尔排序(ShellSort) c源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简单插入排序,折半插入排序和2路插入排序
- 下一篇: 花呗退款到下个月账单怎么抵消