前面我們分析的三種演算法,最壞的情況下時間複雜度都是o(n^2),下面我們介紹一種可以超越o(n^2)的排序演算法。
基本思想:希爾排序屬於插入類排序,採用跳躍分割的策略,將相距某個「增量」的記錄組成乙個子串行,這樣才能保證在子串行內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序。
所謂的基本有序,就是小的關鍵字基本在前面,大的基本在後面,不大不小的在中間。
package sort;
/** * created by lkl on 2017/3/2.
*/public
class testshellsort ;
shellsort(adj);
for(int i : adj)
}private
static
void
shellsort(int adj)
adj[in] = temp;
}//縮小增量間距
increment = (increment - 1) / 3;}}
}
執行上述**結果如下:
0123456789
結果分析:
(1)原序列經過increment第一次分割後,得到這樣乙個子串行:0,increment,2increment,3increment…
(2)**例項中
第一次:increment=4,此時分為了(0,4,8)(1,5,9)(2,6)(3,7)四個子串行。然後外層for迴圈對每一分組的前兩個資料進行插入排序,然後前三個…一次
(3)當increment=1時,在此序列中,進行插入排序。
希爾排序比插入排序快很多,是因為當increment很大時,資料項的每一堂排序移動的元素個數少,但移動的距離很長,效率較高;當increment減小時,每一堂排序移動的元素個數增加,但此時的資料項已經接近於它們最終排序後的位置,插入排序顯得更有效。
希爾排序的關鍵在於將相隔某個「增量」的記錄組成乙個子串行,實現跳躍式的移動,使得排序的效率更高。
大量的研究表明,當增量序列為dlta[k]=2^(t-k+1)-1 (0<=k<=t<=log2(n+1))時,效果較好,此時的時間複雜度為o(n^(3/2)),特別注意的是,增量序列的最後乙個增量值必須得等於1.同時由於記錄是跳躍式的移動,希爾排序並不是一種穩定的演算法。
希爾排序 最壞時間 演算法篇 希爾排序
在之前的文章裡,我們講解了插入排序,而希爾排序相當於對插入排序的一種優化。在這裡我們簡單回顧下插入排序,插入排序的核心思想是,從陣列首位開始,通過遍歷,將相鄰的兩個元素進行排列,小的元素放在前面,大的元素放在後面,並使用遞迴,將調換位置的元素繼續與前面的元素進行比較,一直到前i個元素有序為止。然後重...
排序4 插入排序(希爾排序)
從前面的介紹可以看到,一般情況下,對於同一序列的排序,儘管在實際的操作次數上我們進行了不斷的改進,但是,仍然無法改變其時間複雜度為o n2 的事實,因此,當序列元素個數n變得越來越大時,之前所介紹的排序演算法在效能上的改進也將顯得無力。在插入排序中,有種排序或許能在n比較大的時候,在效能上有較好的表...
學習排序演算法4 希爾排序
此 需要用到我前面三個部落格的部分 因為此處將希爾排序和選擇排序,插入排序進行了執行時間的比較 希爾排序 思想 是一種對插入排序的改進,因為插入排序每次交換只能交換相鄰的元素,元素挪到自己正確的位置可能需要移動很多次。所以希爾排序交換不相鄰的元素,以對陣列進行區域性排序,並最終用插入排序將區域性有序...