排序演算法 (8)希爾排序

2022-08-16 14:12:15 字數 1816 閱讀 1081

2019-11-10  11:44:39  by衝衝

希爾排序(shell排序),是插入排序(直接插入)的增強版。

特點是,在不斷縮小增量的過程中,不斷地排序,使得在最終使用插入排序時,序列已經基本有序。插入排序在操作基本有序的序列時效率倍增。

把序列按步長gap分組,對每組小序列採用直接插入排序方法進行排序。

隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到1時,整個資料合成為一組,構成一組基本有序的序列,進行最後一趟插入排序,完成排序。

例析,初始時,有乙個大小為 10 的無序序列。

在第一趟排序中,設定 gap1 = n / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。然後使用直接插入排序的方法對每個組進行排序。

在第二趟排序中,設定 gap2 = gap1 / 2 = 2 (取整數)。即每相隔距離為 2 的元素組成一組,可以分為 2 組。然後使用直接插入排序的方法對每個組進行排序。

在第三趟排序中,設定gap3 = gap2 / 2 = 1。 即相隔距離為 1 的元素組成一組,即只有一組。然後使用直接插入排序的方法對每個組進行排序。此時,排序已經結束。

希爾排序是不穩定性排序:圖中有兩個相等數值的元素 5 和 5,在排序過程中,兩個元素位置交換了。

1

public

class

shellsort ;45

//呼叫希爾排序方法

6 shellsort shell = new

shellsort();

7 system.out.print("排序前:\t\t");

8shell.printall(array);

9shell.shellsort(array);

10 system.out.print("排序後:\t\t");

11shell.printall(array);12}

1314

public

void shellsort(int

list)

27 list[j + gap] =temp;28}

2930 system.out.format("gap = %d:\t", gap);

31printall(list);

32 gap = gap / 2; //

減小增量33}

34}3536

//列印完整序列

37public

void printall(int

list)

41system.out.println();42}

4344 }

1 排序前:        9    1    2    5    7    4    8    6    3    5    

2 gap = 5: 4 1 2 3 5 9 8 6 5 7

3 gap = 2: 2 1 4 3 5 6 5 7 8 9

4 gap = 1: 1 2 3 4 5 5 6 7 8 9

5 排序後: 1 2 3 4 5 5 6 7 8 9

排序演算法 希爾排序

如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...

排序演算法 希爾排序

摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...

排序演算法 希爾排序

希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...