主要思想:先將待排序列分割成若干個子串行,在子串行內分別進行直接插入排序,待整個序列基本有序時,再對全體記錄進行直接插入排序。
例如:
* 第一趟 d = 5, 將所有相距為 5 的記錄分為一組,從而將整個序列分割成了 5 個子序列。* 第二趟 d = 2, 將所有相距為 2 的記錄分為一組, 從而將整個序列分割成了8 個子序列。(0,2).... (7,9)
* 初始化序列為 [59, 20, 17, 36, 98, 14, 23, 83, 13, 28]
* a[0]和a[5]比較,59小於14,交換;a[1]和a[7]比較,20小於23,不交換;依次類推,增量為5(前者大於後者則交換)*第一趟結果(d=5) [14, 20, 17, 13, 28, 59, 23, 83, 36, 98]
* a[0]和a[2]比較,14小於17,不交換; a[1]和a[3]比較,20大於13,交換;a[2]和a[4];a[3]和a[5]依次類推,增量為2(前者大於後者則交換)*第二趟結果(d=2) [14, 13, 17, 20, 23, 59, 28, 83, 36, 98]
*第三趟結果(d=1)[13,14,17,20,23,28,36,59,83,98]——當d=1時,內層兩個迴圈相當於就是乙個直接插入排序,但是此時序列已經基本有序,卻很少進入最內層迴圈。所以當d=一的時候只是進行比較,很少移動記錄,此時這趟複雜度就接近o(n)。
*這樣就直到d=1時所有記錄進行一次直接插入排序,但是此時效率已經很高,最終所有記錄將成為乙個有序序列。
* 插入排序: 希爾排序
*/@override
public void shellsort(t t)
t[j] = tmp;
}} system.out.println("希爾排序:");
print(t);
}這裡的compare 、 print 方法將在講解完全部排序介紹,這裡仍然才用泛型。
效能分析:希爾排序的時間效能是乙個複雜的問題,因為它所取的增量可能會不同,所以時間複雜度難以確定,但是經過大量試驗指出:希爾排序的時間效能在o(n*n)和o(nlogn)z之間,大約為o(n的1.3次方)。穩定性:若兩個記錄a和b值相等,但是排序後a、b的先後次序保持不變,則這種排序是穩定的,否則就是不穩定。
總結:
(1)希爾排序是對直接插入排序的一種改進,利用了直接插入排序在記錄基本有序時排序效率高的特點。
(2)希爾排序是一種不穩定的排序演算法,因為跳躍的可能
(3)將序列分為若干個子串行,開始時增量的取值較大,每個子串行中的記錄個數較少,並且提供了跳躍的可能性,排序效率較高,能將後面小的的往前移,前面大的往後移。後來增量逐漸縮小,沒個子序列的個數增加,但是此時序列以及基本有序,效率也比較高。
排序演算法(二)希爾排序
希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。public static int shellsort int a 希爾排序 時間複雜度 希爾排序的時間複雜度與增量序列的選取有關,例如希爾增量時間複雜度為o n 而hibbard增量的希...
排序演算法 二 希爾排序
希爾排序是1959 年由d.l.shell 提出來的,相對直接插入排序有較大的改進。希爾排序又叫縮小增量排序 基本思想 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。操作方法 選擇乙個增量序列t1,t2,tk,其中...
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...