上手難度:★★★★
演算法複雜度:o(n^(1.3—2))
shell.gif
排序思想:
最開始以整個陣列長度的一半作為步長gap進行分組;
例如8個元素,索引0和索引4一組,索引1和索引5一組,索引2和索引6一組,索引3和索引7一組,分別對分好的組使用插入排序進行排序,這樣就得到了4個已經排好序的四組資料,
再對步長gap進行對半取值得到2,就會將索引0、索引2、索引4和索引6一組,索引1、索引3、索引5和索引7一組,再對這兩組進行插入排序,就得到了兩個排好序的陣列;
再對步長gap進行對半取值得到1,就得到了一組資料,再對這一組資料進行插入排序,就能得出最終結果;
之所以沒有一開始就進行插入排序,是因為,在大量資料面前,希爾排序通過對乙個個分組進行排序,減少了比較和交換需要的次數,下圖是10000個元素下插入排序和希爾排序的對比
**實現:
public class shellsort ;
shellsort(arr);
for( int i = 0 ; i < arr.length ; i ++ ){
system.out.print(arr[i]);
system.out.print(' ');
優點:減少交換次數,比插入排序提高了效率,因為插入排序每次只比較一位,而希爾排序通過分組的形式,減少了比較次數
缺點:反直覺,只適合計算機中使用
優化方式:
希爾排序的間隔序列不推薦用2的冪(1 2 4 8 16...),因為這樣直到間隔為1之前,
都不會將奇數字置與偶數字置的元素進行比較,這樣是低效的。希爾自己認為可以用2的冪 - 1序列(1 3 7 15...),後來又有文章建議用3x + 1(1 4 13 40 121...),都是可以的。
public static void shellsort2(int arr){
int gap = 1;
while (gap < arr.length/3) {
gap = gap * 3 + 1;
// 當gap小於陣列整個長度的三分之一時,就自增3倍並且加1
// 1 4 13 40這種增長模式
while (gap > 0) {
for (int i = gap; i < arr.length; i++) {
insert(arr, gap, i);
gap = (int) math.floor(gap / 3);
希爾排序python 簡書 JS實現希爾排序
希爾排序本質上是一種插入排序,但是對數列進行了等間隔分組處理,在每一組中做插入排序,這一優化使得原本 o n 2 的時間複雜度一下降為 o nlogn 基本思想 希爾排序是按一定的間隔對數列進行分組,然後在每乙個分組中做插入排序 隨後逐次縮小間隔,在每乙個分組中做插入排序.直到間隔等於1,做一次插入...
希爾排序python 簡書 資料結構 排序
資料結構 排序 直接插入排序 希爾排序 其實主要是為了講述希爾排序,不過插入排序是希爾排序的基礎,因此先來講直接插入排序。一 直接插入排序 1 原理 下標tmp 假設陣列為a,i為當前元素下標,則a i 為當前元素的值 從下標i 2開始迴圈,與自己之前的元素比較大小 預設自己之前的序列已經是有序 公...
希爾排序的增量怎麼算 排序演算法之希爾排序
希爾排序是希爾 donald shell 於1959年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破o n2 的第一批演算法之一。簡單插入排序很循規蹈矩,不管陣列分布是怎麼樣的,依然一步一步的對元素進行比較,移動...