梳排序(Comb sort)是一種不穩定的排序算法,它是冒泡排序的優化版本。其原理與希爾排序類似,在原始的冒泡排序算法中,每次只比較序列中的相鄰兩個元素,即比較的兩元素的間距(Gap)是1,而梳排序初始時兩兩比較的兩元素的間距比1大,並在循環中以固定的比率遞減,通常遞減率爲1.3,直到間距減小到1爲止。
遞減率的設定影響着梳排序的效率,原作者以隨機數作實驗,得到最有效遞減率爲1.3的。如果此比率太小,則導致一循環中有過多的比較,如果比率太大,則不能有效消除陣列中的烏龜(即在陣列尾部的小數值)。
以輸入數組 [8 4 3 7 6 5 2 1] 爲例
數組長度爲8,有8÷1.3=6,則比較8和2,4和1,並做交換
[8 4 3 7 6 5 2 1]
交換得
[2 1 3 7 6 5 8 4]
接着循環,更新間距爲6÷1.3=4,比較2和6,1和5,3和8,7和4
[2 1 3 7 6 5 8 4]
只有7和4需要交換,交換得
[2 1 3 4 6 5 8 7]
接着循環,更新距離爲3,沒有交換
接着循環,更新距離爲2,沒有交換
接着循環,更新距離爲1,需要三次交換
[2 1 3 4 6 5 8 7]
交換後的結果爲 [1 2 3 4 5 6 7 8] 即爲所求有序序列。
C++實現
#include<bits/stdc++.h>
using namespace std;
// To find gap between elements
int getNextGap(int gap)
{
// Shrink gap by Shrink factor
gap = (gap*10)/13;
if (gap < 1)
return 1;
return gap;
}
// Function to sort a[0..n-1]