希爾排序演算法是對插入排序的一種改進,其核心是減少已排序區域的右移次數來提高速度。具體做法是先獲得乙個間隔數值 h,然後將 n-1 替換成 n-h 來完成插入排序。
具體例子:
元素集合 = [2, 9, 5, 1, 8, 3, 6, 4, 7, 0]
間隔數值 h = 4
第一次迴圈: 當前元素 array[4] = 8,那麼 (n - h) = (4 - 4) = array[0] = 2,由於 8 > 2,因此不發生交換。
第二次迴圈: 當前元素 array[5] = 3,那麼 (n - h) = (5 - 4) = array[1] = 9,由於 3 < 9,交換結果 2, [3], 5, 1, 8, [9], 6, 4, 7, 0。
繼續迴圈,直到 n == array.length - 1。
接下來減小 h 值開始下一輪間隔迴圈,直到獲得最終排序結果。
對於間隔數值的獲取,通常用以下公式。
h = h * 3 + 1;
我們先給出具體的**,然後和插入排序做個對比。
static void shellsort(int array)
while (h > 0)
array[inner] = temp;
var s = string.join(",", array.convertall(array, i => i.tostring()));
console.writeline("h:, outer:, temp:, ", h, outer, temp, s);
}h = (h - 1) / 3;}}
static void main(string args)
;shellsort(array);
}結果:
h:4, outer:4, temp:8, 2,9,5,1,8,3,6,4,7,0
h:4, outer:5, temp:3, 2,3,5,1,8,9,6,4,7,0
h:4, outer:6, temp:6, 2,3,5,1,8,9,6,4,7,0
h:4, outer:7, temp:4, 2,3,5,1,8,9,6,4,7,0
h:4, outer:8, temp:7, 2,3,5,1,7,9,6,4,8,0
h:4, outer:9, temp:0, 2,0,5,1,7,3,6,4,8,9
h:1, outer:1, temp:0, 0,2,5,1,7,3,6,4,8,9
h:1, outer:2, temp:5, 0,2,5,1,7,3,6,4,8,9
h:1, outer:3, temp:1, 0,1,2,5,7,3,6,4,8,9
h:1, outer:4, temp:7, 0,1,2,5,7,3,6,4,8,9
h:1, outer:5, temp:3, 0,1,2,3,5,7,6,4,8,9
h:1, outer:6, temp:6, 0,1,2,3,5,6,7,4,8,9
h:1, outer:7, temp:4, 0,1,2,3,4,5,6,7,8,9
h:1, outer:8, temp:8, 0,1,2,3,4,5,6,7,8,9
h:1, outer:9, temp:9, 0,1,2,3,4,5,6,7,8,9
我們測試一下和插入排序的效能比較。
class program
array[inner] = temp;
}return count;
}static int shellsort(int array)
while (h > 0)
array[inner] = temp;
}h = (h - 1) / 3;
}return count;
}static void main(string args)
-------------", length);
int array = new int[length];
var ran = new random();
for (int i = 0; i < array.length; i++)
action> sort = (arr, func) =>
: , ",
func != null ? func.method.name : "array.sort",
watch.elapsedmilliseconds,
count);
}; var a1 = array.clone() as int;
var a2 = array.clone() as int;
var a3 = array.clone() as int;
sort(a1, insertionsort);
sort(a2, shellsort);
sort(a3, null);}}
}測試結果:
-10000-------------
insertionsort: 187 , 24806724
shellsort: 3 , 165022
array.sort: 1 , 0
-20000-------------
insertionsort: 608 , 99354518
shellsort: 7 , 373684
array.sort: 2 , 0
-30000-------------
insertionsort: 1377, 226557244
shellsort: 12 , 653250
array.sort: 4 , 0
-40000-------------
insertionsort: 2441, 401343428
shellsort: 16 , 927861
array.sort: 5 , 0
-50000-------------
insertionsort: 3823, 628045456
shellsort: 21 , 1169268
array.sort: 7 , 0
我們可以看到,無論是時間還是右移次數上,希爾排序都比插入排序少很多,整體效能有極大提高,甚至接近 array.sort() 。
排序演算法 希爾排序
如果乙個排序演算法,每次只把諸專案移動乙個位置,則它的平均執行時間至少要和n2成比例.因為在這個排序演算法執行的過程當中,每個記錄平均都必須遍歷n 3個位置,因此如果要對直接插入排序進行有效的,實質性的改進的話,就要有一種演算法,它可以使記錄做長距離的跳躍,而不是一步一步的挪動.希爾排序也是一種插入...
排序演算法 希爾排序
摘要 排序演算法有很多,最簡單的有氣泡排序和插入排序,這兩種方法都具有o n 2 的時間界.我們想要討論的是具有更好的時間界的排序演算法,比如希爾排序.1 希爾排序的思路是通過比較一定間距的元素來進行排序,最後再對所有相鄰元素進行一次插入排序.2 希爾排序最重要的引數是增量序列 h1,h2,ht 只...
排序演算法 希爾排序
希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。希爾排序是非穩定排序演算法。希爾排序通過將比較的全部元素分為幾個區域來提公升插入排序的效能。這樣可以讓乙個元素可以一次性地朝最終位置前進一大步。然後演算法再取越來越小的步長進行排序,演算法的最後一步就是普通的插入排序,但是到了這步,...