梳排序(comb sort)是一種由wlodzimierz dobosiewicz於2023年所發明的不穩定排序演算法,並由stephen lacey和richard box於2023年四月號的byte雜誌中推廣。梳排序是改良自氣泡排序和快速排序。
在氣泡排序演算法中,只比較陣列中相鄰的二項,即比較的二項的間距(gap)是1,梳排序提出此間距其實可大於1,改自插入排序的希爾排序同樣提出相同觀點。梳排序中,開始時的間距設定為陣列長度,並在迴圈中以固定比率遞減,通常遞減率設定為1.24。在一次迴圈中,梳排序如同氣泡排序一樣把陣列從首到尾掃瞄一次,比較及交換兩項,不同的是兩項的間距不固定於1。如果間距遞減至1,梳排序假定輸入陣列大致排序好,並以氣泡排序作最後檢查及修正。
使用梳排序為一列數字進行排序的過程
例:88 7 79 64 55 98 48 52 4 13
第一趟: gap=10/1.24=8
比較數值對: (88, 4), (7, 13)
結果為:4 7 79 64 55 98 48 52 88 13
第二趟: gap=8/1.24=6
比較數值對: (4, 48), (7, 52), (79, 88), (64, 13)
結果為:4 7 79 13 55 98 48 52 88 64
第三趟: gap=6/1.24=4
比較數值對: (4, 55), (7, 98), (79, 48) 交換後:4 7 48 13 55 98 79 52 88 64
繼續比較數值對:(13, 52), (55, 88), (98, 64)
結果為:4 7 48 13 55 64 79 52 88 98
第四趟: gap=4/1.24=3
比較數值對: (4, 13), (7, 55), (48, 64), (13, 79), (55, 52), (64, 88), (79, 98)
結果為:4 7 48 13 52 64 79 55 88 98
第五趟: gap=3/1.24=2
比較數值對: (4, 48), (7, 13), (48, 52), (13, 64), (52, 79), (64, 55), (79, 88), (55, 98),
結果為:4 7 48 13 52 55 79 64 88 98
第六趟: gap=2/1.24=1
比較數值對: (4, 7), (48, 13), (52, 55), (79, 64), (88, 98)
結果為:4 7 13 48 52 55 64 79 88 98
演算法實現:
//completed on 2014.10.8 21:27
//language: c99
////
//#include#includevoid swap(int *a, int *b) //
交換兩元素的值
void printarray(int a, int count) //
列印陣列元素
void combsort(int *a, int size)
++i;}}}
int main(void)
; int n = sizeof(a) / sizeof(*a);
printarray(a, n);
combsort(a, n);
printarray(a, n);
return
0;}
排序演算法之梳排序
基本思想 梳排序和希爾排序很類似。希爾排序是在直接插入排序的基礎上做的優化,而梳排序是在氣泡排序的基礎上做的優化。也是想希爾排序一樣,將待排序序列通過增量分為若干個子串行,然後對子序列進行一趟氣泡排序,一步步減小增量,直至增量為1。所以梳排序的最後一次排序是氣泡排序。梳排序增量是根據遞減率減小的,遞...
C 模板實現梳排序
梳排序是一種改進的氣泡排序演算法,通過比較元素彼此之間的步長位置這種方式先對資料進行預處理,在每次移動中,步長會越來越小,直至他等於1.這一理念就是在正式排序前先將一些大元素移動至陣列的底部.之後正式排序採用氣泡排序演算法來進行.大量試驗證明,步長縮短因子為1.3時,能達到較高的效率.梳排序的良好效...
經典演算法題每日演練 第二十四題 梳排序
這篇再看看乙個經典的排序,梳排序,為什麼取名為梳,可能每個梳都有自己的gap吧,大梳子gap大一點,小梳子gap小一點。氣泡排序上我們的選擇是相鄰的兩個數做比較,就是他們的gap為1,其實梳排序提出了不同的觀點,如果將這裡的gap設定為一定的大小,效率反而必gap 1要高效的多。下面我們看看具體思想...