1.希爾排序的定義
希爾排序(縮小增量排序),是對直接插入排序演算法的優化和公升級。
2.希爾排序的原理
因此,採用跳躍分割的策略:將相距某個「增量」的記錄組成乙個子串行,這樣才能保證在子串行內分別進行直接插入排序後得到的結果是基本有序而不是區域性有序。
3.希爾排序的流程
例項:
分析:注:圖中兩個相等的元素 5 。在排序過程中,兩個元素位置交換了。所以,希爾排序是不穩定的演算法。
4.希爾排序的**實現
public
class shellsort ;
system.out.println("排序前:");
print(data);
shellsort(data);
system.out.println("排序後: ");
print(data);
}public
static
void
shellsort(int data)
while (h >= 1)
data[j + h] = tmp;}}
// print(data);
// 計算出下乙個h值
h = h / 3;}}
public
static
void
print(int data)
system.out.println();}}
輸出結果
排序前:
5 3 6 2 1 9 4 8 7
排序後:
1 2 3 4 5 6 7 8 9
注:常用的h序列由knuth提出,該序列從1開始,通過公式h = 3 * h +1產生。
5.演算法分析
(1)希爾排序的演算法效能
(2)時間複雜度
不確定,與步長有關。平均為o(nlogn)
(3)演算法穩定性
一次插入排序是穩定的,不會改變相同元素的相對順序,由於希爾排序的多次插入排序,在不同的插入排序過程中,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂(見上圖),所以是不穩定的。
6.直接插入排序和希爾排序的比較
本人才疏學淺,若有錯,請指出
謝謝!
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...
排序演算法 希爾排序
摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...
排序演算法 希爾排序
希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...