三種常見的插入排序

直接插入排序

    public static void insertSort(int[] array) {
        if (array == null || array.length <= 1) {
            return;
        }
        int temp = 0;
        int insertIndex = 0;
        int gap = array.length / 2; // 增量
        while (gap >= 1) {
            for (int i = gap; i < array.length; i++) {
                temp = array[i];
                insertIndex = i - gap;  // 比較同組前一個數字
                while (insertIndex >= 0 && temp < array[insertIndex]) { // 依次比較同組前一個數字
                    array[insertIndex + gap] = array[insertIndex];
                    insertIndex -= gap;
                }
                array[insertIndex + gap] = temp;
            }
            gap /= 2;   // 縮小增量
        }
    }

折半插入排序

    public static void insertSort(int[] array) {
        if (array == null || array.length <= 1) {
            return;
        }
        int low = 0, high = 0, mid = 0;  // 折半查找三個關鍵變量
        for (int i = 1; i < array.length; i++) {
            int temp = array[i];
            low = 0;
            high = i - 1;
            while (low <= high) {   // 進行二分搜索
                mid = (low + high) / 2;
                if (array[mid] > temp) {
                    high = mid - 1;
                } else {
                    low = mid + 1;
                }
            }
            for (int j = i - 1; j >= low; j--) {
                array[j + 1] = array[j];
            }
            array[low] = temp;
        }
    }

希爾排序

    public static void insertSort(int[] array) {
        if (array == null || array.length <= 1) {
            return;
        }
        int temp = 0;
        int insertIndex = 0;
        int gap = array.length / 2; // 增量
        while (gap >= 1) {
            for (int i = gap; i < array.length; i++) {
                temp = array[i];
                insertIndex = i - gap;  // 比較同組前一個數字
                while (insertIndex >= 0 && temp < array[insertIndex]) { // 依次比較同組前一個數字
                    array[insertIndex + gap] = array[insertIndex];
                    insertIndex -= gap;
                }
                array[insertIndex + gap] = temp;
            }
            gap /= 2;   // 縮小增量
        }
    }

 

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