選擇排序~冒泡排序~插入排序~快速排序

public class Sort {

    public static void main(String[] args) {

        int[] arr = new int[]{4, 1, 5, 3, 8, 2, 7, 9, 6};
        Sort sort = new Sort();

        //sort.selectSort(arr);
        //sort.bubbleSort(arr);
        //sort.insertSort(arr);
        sort.quickSort(arr, 0, arr.length - 1);

        for (int i : arr) {
            System.out.print(i + "\t");
        }
    }

    /**
     * 選擇排序:
     * 假設第一個爲最小值,將其與後面的數依次比較,找出真正最小的值並標記位置
     * 將最小值與原來的最小值位置互換,開始第二輪假設
     */
    public void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int min = arr[i];
            int minIndex = i;//記錄最小值的人下標
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < min) {
                    min = arr[j];
                    minIndex = j;
                }
            }
            if (minIndex != i) {
                int temp = arr[i];
                arr[i] = arr[minIndex];
                arr[minIndex] = temp;
            }
        }
    }

    /**
     * 冒泡排序
     * 從後往前冒出每一輪比較的最小值
     */
    public void bubbleSort(int[] arr) {

        for (int i = 1; i < arr.length; i++) {
            for (int j = arr.length - 1; j >= i; j--) {
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
        }
    }

    /**
     * 插入排序
     * 將下一個元素插入到前面已經排好的隊列中
     * 將下一個元素與前面隊列的元素一一比較交換至合適的位置
     */
    public void insertSort(int[] arr) {

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

    /**
     * 快速排序
     * 通過一趟排序將要排序的數據分割成獨立的兩個部分,
     * 一部分的所有數據都小於某個值,另一部分所有的數據都大於某個值,
     * 然後按照此方法對這兩部分的數據分別進行快速排序,整個排序的過程可以遞歸進行,
     * 以此將整個數據變成有序的序列。
     * a:先從數列中取出第一個數作爲基準數。
     * b:分區過程中,小於或者等於它的數放在它的左邊,將比這個數大的數全放在它的右邊,
     * c:再對左右區間重複第二步,直到各個區間只有一個數。
     */
    public void quickSort(int[] arr, int start, int end) {
        if (start >= end) {
            return;
        }
        int i = start;
        int j = end;
        int temp = arr[i];
        while (i != j) {
            while (i < j && arr[j] >= temp) {
                j--;
            }
            if (i < j) {
                arr[i] = arr[j];
            }
            while (i < j && arr[i] <= temp) {
                i++;
            }
            if (i < j) {
                arr[j] = arr[i];
            }
        }
        arr[i] = temp;
        quickSort(arr, start, i - 1);
        quickSort(arr, i + 1, end);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章