《演算法(第四版)》排序 希爾排序

2021-07-10 22:33:43 字數 1329 閱讀 3088

由「插入排序」可知,它是一種不穩定的演算法,當序列已經接近有序時,排序速度較快,但是如果最小的在最後面,那可能需要最小的交換了n-1次才能換到最前面。

希爾排序在插入排序的基礎上進行了改進,交換不相鄰的元素,以對陣列的區域性進行排序,並最終用插入排序將區域性有序的陣列排序,具體做法如下。

1.假設陣列長度為n,先以較大的增量gap將n進行劃分幾組,例如陣列為(n=10),增量gap=7,此時分組情況為,

2.然後將每組的對應位置的數進行比較,小的交換到前面。2比6小不動,4比7小不動,3比8小,換前面,這一輪迴下來的結果

3.再將gap減小,重新分組,例如gap=4,分組情況為,,

4.再將對應位置比較,交換,2<7<9,所以各自交換為,4<8<10,所以交換後的結果

5.在減小gap,直到增量為1時,還是按照插入排序的演算法,將順序排完。

具體演算法如下

public static void shellsort(comparable a)

}//逐步減小h,直至h=1時結束

h = h / 3;

}}

測試程式如下:

public class shellsort 

}h = h / 3;

} }private static boolean less(comparablev, comparablew)

private static void exch(comparable a, int i, int j)

private static void show(comparable a)

} public static boolean issorted(comparable a)

return true;

} public static void main(string args) throws filenotfoundexception ;

integer a = ;

for (int i = 0; i < a.length; i++)

system.out.println();

shellsort(a);

assert issorted(a);

show(a);

}}

希爾排序需要比較的次數為  n^(4/3),或n^(5/4)...,它的效能提高了20%~40%

書上說:「有經驗的程式設計師有時會選擇希爾排序,因為對於中等大小的陣列它的執行時間是可以接受的,它的**量很小,且不需要使用額外的記憶體空間,如果需要解決乙個排序問題而又沒有系統排序函式可用,可以先用希爾排序,然後再考慮是否值得將它替換為更加複雜的排序演算法。

演算法(第四版)學習日記 希爾排序

希爾排序也是屬於插入排序類的一種。空間效率 o 1 時間效率 數學上還未分析出來。穩定性 不穩定 可適用於大型陣列 基本思想 將待排序陣列分割成若干的 特殊 陣列,形如a i,i d,i 2d i kd 將這些陣列進行排序使其有序。通過逐步減小步長d至1,結果使整個陣列有序。摘自演算法 第四版 書中...

《演算法(第四版)》排序 堆排序

1.什麼是堆?講堆排序之前,先了解一下什麼是堆。堆其實相當於一種資料結構,它的本質是一種陣列物件,但是它裡面的內同又是一顆完全二叉樹結構,它的特點是父節點的值大於 或小於 兩個子節點的值,常常用於優先佇列 堆排序等。堆在陣列中的索引有如下的特點。陣列索引為k的元素,它的父節點的索引為 k 2 下取整...

《演算法(第四版)》排序 模板

本書對排序類演算法有乙個模板,包括了以下幾種方法 1 sort 這個方法裡面實現的就是排序的演算法 2 less 這個方法裡是利用了comparable介面裡的compareto方法,其中compareto方法對於本物件與傳入的比較物件小於,等於,大於,分別返回負數,0,正數 這個方法如果compa...