冒泡,選擇,插入排序以及二分查找

冒泡排序
/**
 * 冒泡排序
 * 保證最大值在最后面
 *
 * @param arrs
 */
static void bubbleSort(int[] arrs) {
    beforeSort(arrs);
    for (int i = 0; i < arrs.length; i++) {
        for (int j = 0; j < arrs.length - 1 - i; j++) {
            if (arrs[j] > arrs[j + 1]) {
                int temp = arrs[j];
                arrs[j] = arrs[j + 1];
                arrs[j + 1] = temp;
            }
            printHint(arrs, i, j);
        }
        System.out.println();
    }
}

選擇排序

/**
 * 選擇排序
 * 保證最左邊的最小
 *
 * @param arrs
 */
private static void selectSort(int[] arrs) {
    beforeSort(arrs);
    for (int i = 0; i < arrs.length - 1; i++) {
        for (int j = i + 1; j < arrs.length; j++) {
            if (arrs[i] > arrs[j]) {
                int temp = arrs[j];
                arrs[j] = arrs[i];
                arrs[i] = temp;
            }
            printHint(arrs, i, j);
        }
        System.out.println();
    }
}

優化選擇排序

/**
 * 大大的減少數組變動次數
 *
 * @param arrs
 */
private static void betterSelectSort(int[] arrs) {
    beforeSort(arrs);
    for (int i = 0; i < arrs.length - 1; i++) {
        int k = i;
        for (int j = i + 1; j < arrs.length; j++) {
            if (arrs[k] > arrs[j]) k = j;
        }
        if (k != i) {
            int temp = arrs[i];
            arrs[i] = arrs[k];
            arrs[k] = temp;
        }
        System.out.print("第" + (i + 1) + "次遍排序:" + "\t\t");
        for (int x : arrs) {
            System.out.print(x + "\t");
        }
        System.out.println();

    }
}

插入排序

/**
 * 插入排序,認為左邊的數是有序數列
 *
 * @param arrs
 */
private static void insertSort(int[] arrs) {
    beforeSort(arrs);
    int count = 0;
    for (int i = 1; i < arrs.length; i++) {
        for (int j = i; j > 0; j--) {
            if (arrs[j] < arrs[j - 1]) {
                int temp = arrs[j - 1];
                arrs[j - 1] = arrs[j];
                arrs[j] = temp;
            } else {
                break;
            }
            System.out.print("第" + ++count + "次遍排序:" + "\t\t");
            for (int x : arrs) {
                System.out.print(x + "\t");
            }
        }
        System.out.println();
    }

}

排序案例

public class Demo{
    private static final int[] arrs = {45, 12, 46, 20, 48, 33};

    public static void main(String[] args) {
        //冒泡排序
        //bubbleSort(arrs);
        //選擇排序
        //selectSort(arrs);
        //簡化版選擇排序
        //betterSelectSort(arrs);
        //插入排序
        insertSort(arrs);

    }


    /**
     * 冒泡排序
     * 保證最大值在最后面
     *
     * @param arrs
     */
    static void bubbleSort(int[] arrs) {
        beforeSort(arrs);
        for (int i = 0; i < arrs.length; i++) {
            for (int j = 0; j < arrs.length - 1 - i; j++) {
                if (arrs[j] > arrs[j + 1]) {
                    int temp = arrs[j];
                    arrs[j] = arrs[j + 1];
                    arrs[j + 1] = temp;
                }
                printHint(arrs, i, j);
            }
            System.out.println();
        }
    }


    /**
     * 選擇排序
     * 保證最左邊的最小
     *
     * @param arrs
     */
    private static void selectSort(int[] arrs) {
        beforeSort(arrs);
        for (int i = 0; i < arrs.length - 1; i++) {
            for (int j = i + 1; j < arrs.length; j++) {
                if (arrs[i] > arrs[j]) {
                    int temp = arrs[j];
                    arrs[j] = arrs[i];
                    arrs[i] = temp;
                }
                printHint(arrs, i, j);
            }
            System.out.println();
        }
    }

    /**
     * 大大的減少數組變動次數
     *
     * @param arrs
     */
    private static void betterSelectSort(int[] arrs) {
        beforeSort(arrs);
        for (int i = 0; i < arrs.length - 1; i++) {
            int k = i;
            for (int j = i + 1; j < arrs.length; j++) {
                if (arrs[k] > arrs[j]) k = j;
            }
            if (k != i) {
                int temp = arrs[i];
                arrs[i] = arrs[k];
                arrs[k] = temp;
            }
            System.out.print("第" + (i + 1) + "次遍排序:" + "\t\t");
            for (int x : arrs) {
                System.out.print(x + "\t");
            }
            System.out.println();

        }
    }


    /**
     * 插入排序,認為左邊的數是有序數列
     *
     * @param arrs
     */
    private static void insertSort(int[] arrs) {
        beforeSort(arrs);
        int count = 0;
        for (int i = 1; i < arrs.length; i++) {
            for (int j = i; j > 0; j--) {
                if (arrs[j] < arrs[j - 1]) {
                    int temp = arrs[j - 1];
                    arrs[j - 1] = arrs[j];
                    arrs[j] = temp;
                } else {
                    break;
                }
                System.out.print("第" + ++count + "次遍排序:" + "\t\t");
                for (int x : arrs) {
                    System.out.print(x + "\t");
                }
            }
            System.out.println();
        }

    }

    /**
     * 這體現代碼,復用
     *
     * @param arrs
     */
    private static void beforeSort(int[] arrs) {
        System.out.print("排序前:\t\t\t");
        for (int k : arrs) {
            System.out.print(k + "\t");
        }
        System.out.println();
    }

    /**
     * 這體現代碼,復用
     * 同樣你也可以把數組交換的代碼抽做一個方法,
     *
     * @param arrs
     * @param i
     * @param j
     */
    private static void printHint(int[] arrs, int i, int j) {
        System.out.print("第" + (i + 1) + "次" + "第" + (j + 1) + "遍排序:" + "\t\t");
        for (int k : arrs) {
            System.out.print(k + "\t");
        }
    }

}

二分法查找

二分法查找的前提是數組必須是有序的;

二分查找案例

public class Demo {
    private static final int[] arrs = {45, 12, 46, 20, 48, 33};

    private static final int[] arrs1 = {45, 12, 46, 20, 48, 33};

    public static void main(String[] args) {
        //首先排序數組
        insertSort(arrs);
        sop(arrs);
        //查找
        int index = binaryFind(arrs, 20);

        int index2 = binaryFind(arrs, 90);

        sop(index, 20);
        sop(index2, 90);
        System.out.println("================系統自帶的Arrays類=================");
        Arrays.sort(arrs1);
        System.out.println(Arrays.toString(arrs1));
        System.out.println("20查找的位置:" + Arrays.binarySearch(arrs1, 20));
        System.out.println("90查找的位置:" + Arrays.binarySearch(arrs1, 90));

    }

    private static void sop(int index, int key) {
        System.out.println();
        if (index != -1) {
            System.out.println(key + "的位置為:" + index);
        } else {
            System.out.println("沒有找到" + key + "的位置");
        }
    }

    private static int binaryFind(int[] arrs, int key) {
        //數組操作 下標是關鍵
        //定義下標
        int min = 0;//最小值下標
        int max = arrs.length - 1;//最大值下標
        int mid = arrs.length / 2;//中間值下標
        while (min < max) {//查找的終止條件
            if (arrs[mid] > key) {//表明key在數組前部分
                max = mid - 1;
            } else if (arrs[mid] < key) {//表明key在數組后半部分
                min = mid + 1;
            } else {
                return mid;//找到下標
            }
            mid = (min + max) / 2;//中間下標也要改變
        }
        return -1;
    }


    private static void sop(int[] arrs) {
        System.out.println("排序后:");
        for (int k : arrs) {
            System.out.print(k + "\t");
        }
    }

    private static void insertSort(int[] arrs) {
        for (int i = 1; i < arrs.length; i++) {
            for (int j = i; j > 0; j--) {
                if (arrs[j] < arrs[j - 1]) {
                    int temp = arrs[j - 1];
                    arrs[j - 1] = arrs[j];
                    arrs[j] = temp;
                } else {
                    break;
                }
            }
        }
    }
}

運行結果:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容