梳子排序

梳排序(Comb sort)是一種由Wlodzimierz Dobosiewicz於1980年所發明的不穩定排序算法,並由Stephen Lacey和Richard Box於1991年四月號的Byte雜誌中推廣。梳排序是改良自泡沫排序和快速排序,其要旨在於消除烏龜,亦即在陣列尾部的小數值,這些數值是造成泡沫排序緩慢的主因。相對地,兔子,亦即在陣列前端的大數值,不影響泡沫排序的效能。

梳子排序

在冒泡排序中,只比較陣列中相鄰的兩項,即比較的間距爲1,梳排序提出此間距其實可以大於1,梳排序中,開始時的間距設定爲陣列長度,並在循環中以固定的比率遞減,通常遞減率爲1.3,該數字是原作者通過實驗得到的最有效的遞減率,因爲編程中乘法比除法塊,所以會取遞減率的倒數與間距相乘,即0.8.其實當間距爲1的時候,梳排序就是冒泡排序,而間距大於1的時候,梳排序就是儘量把小的數字往前移動並保證此次間隔內的組是有序的

例如:當間隔爲6時,保證間隔爲6的數字之間是有序的,
當間隔爲4時,保證間隔爲4的數字之間是有序的,
當間隔爲3時,保證間隔爲3的數字之間是有序的,
當間隔爲2時,保證間隔爲2的數字之間是有序的,
當間隔爲1時,爲冒泡排序,調整最後順序使兩兩之間有序。

可以和希爾排序改良插入排序一樣對照着看

例子

例子一

初始化:gap = 數組長度

在這裏插入圖片描述
第一次:gap = gap * 0.8

排序後:[7, 4, 3, 9, 6, 5, 2, 1, 10, 8]
在這裏插入圖片描述

第二次gap = gap * 0.8 = 8 * 0.8 = 6, 排序後:[2, 1, 3, 8, 6, 5, 7, 4, 10, 9]
在這裏插入圖片描述

第三次gap = gap * 0.8 = 6 * 0.8 = 4, 排序後:[2, 1, 3, 4, 6, 5, 7, 8, 10, 9]
在這裏插入圖片描述

第三次gap = gap * 0.8 = 4 * 0.8 = 3, 排序後: [2, 1, 3, 4, 6, 5, 7, 8, 10, 9]
在這裏插入圖片描述
在這裏插入圖片描述

第三次gap = gap * 0.8 = 3 * 0.8 = 2
在這裏插入圖片描述

第四次gap = gap * 0.8 = 2 * 0.8 = 1
在這裏插入圖片描述

在這裏插入圖片描述

第五次gap = gap * 0.8 = 1 * 0.8 = 0 跳出循環

public class TreeNode {
    // 冒泡排序
    private static void bubbleSort(int[] arr){
        for (int i = 0; i < arr.length; i++){ // 有序區個數
            for (int j = 0; j + 1 < arr.length - i; j++){ // arr.length - i 無序去區間
                if (arr[j] > arr[j + 1]){
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    // 梳排序
    private static void combSort(int[] arr){
        int gap = arr.length;
        for (gap = (int) (gap * 0.8) ; gap > 0; gap = (int)(gap * 0.8)){
            for (int i = 0; i + gap < arr.length; i++){ // 每次改變gap,都要從元素首開始比較
                if (arr[i] > arr[i + gap]){
                    swap(arr, i, i + gap);
                }
            }
            System.out.println(Arrays.toString(arr));
         }
    }

    private static void swap(int[] a, int b, int c) {
        if (b == c) return;
        int temp = a[b];
        a[b] = a[c];
        a[c] = temp;
    }


        public static void main(String[] args) {
        int[] arr={10, 4, 3, 9, 6, 5, 2, 1, 7, 8} ;

        combSort(arr);
        System.out.println(Arrays.toString(arr));
    }
}


排序算法之梳排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章