java資料結構排序之希爾排序實現

2021-07-10 14:34:54 字數 1095 閱讀 5936

早上鮮血來潮想寫個希爾排序演算法,發現發生了錯誤,一直不解,最初寫的**如下所示:

static void shellsort(int datalist,int dk)else

}datalist[flag] = temp;

} print(datalist);

}

想呼叫它試試,卻發現

錯誤原因在於紅色**注釋處的判斷條件,希爾排序的規則,應該以待插入的元素為依據,假如待插入的元素大小為temp,所在位置為k,增量為dk,則應該把所有滿足k-=dk且k-=dk所在位置元素大於temp的元素右移dk個位置,但是上述**卻不是以temp為主來判斷大小,而是以k-dk和k所在位置的元素為依據,這樣最終插入temp元素的位置可能不是最合理的位置,就可能會出現如中顯示的錯誤。

正確的希爾排序如下所示

正確**1:

static void shellsort(int datalist,int dk)else

}datalist[flag] = temp;

} print(datalist);

}

正確**2:

static void shellsort(int datalist,int dk)else

}datalist[flag] = temp;

} print(datalist);

}

注意**紅色注釋處,所有的判斷應與temp元素比較。

Java資料結構之希爾排序

希爾排序借用了插入排序,演算法先將要排序的一組數按某個增量gap n 2,n為要排序數的個數 分成若干組,每組中記錄的下標相差gap.對每組中全部元素進行直接插入排序,然後再用乙個較小的增量 gap 2 對它進行分組,在每組中再進行直接插入排序。當增量減到1時,進行直接插入排序後,排序完成。clas...

java資料結構之希爾排序

希爾排序也成為 縮小增量排序 其基本原理是,現將待排序的陣列元素分成多個子串行,使得每個子串行的元素個數相對較少,然後對各個子串行分別進行直接插入排序,待整個待排序列 基本有序 後,最後在對所有元素進行一次直接插入排序。因此,我們要採用跳躍分割的策略 將相距某個 增量 的記錄組成乙個子串行,這樣才能...

資料結構之希爾排序

直接插入排序在資料量較小而且接近 正序 的時候,時間複雜度可以小至o n 所以如果我們能夠讓資料量變小且變得接近 正序 然後用直接插入排序就好了。希爾排序就是做這麼個事情,它首先將資料拆成幾部分,即達到縮小資料規模排序,再將資料合併起來,達到整體的 正序 然而將資料的正序並非區域性的 正序 即不是 ...