快速排序 (Quick Sort)

H的世界發表於2024-03-23
public static void main(String[] args) {
    int[] arr = {9, 5, 7, 3, 1, 6, 8, 4, 2};
    quickSort(arr,0,arr.length - 1);
}

private static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    //先排序一遍,再遞迴拆分,和歸併有區別,歸併是先拆分,再合併排序
    int partition = partition(arr, left, right);//排序完找到前一趟基準值下標,作為左右陣列的左右邊界
    System.out.println(Arrays.toString(arr));
    quickSort(arr,left,partition - 1);//基準位置已經排序,不用向歸併一樣參加排序
    quickSort(arr,partition + 1,right);//基準位置已經排序,不用向歸併一樣參加排序


}

private static int partition(int[] arr, int left, int right) {
    //陣列的第一個元素作為基準值
    int pivot = arr[left];
    int i = left;
    int j = right;
    int temp = 0;
    while (i < j) {
        //從右邊開始找,找到小於基準值的數
        //跳出迴圈說明要麼找到小於基準值的,要麼就是j和i重了
        while (i<j && arr[j] >= pivot) {
            j--;
        }
        //從左邊開始找,找到大於基準值的數
        //跳出迴圈說明要麼找到小於基準值的,要麼就是j和i重了
        while (i < j && arr[i] <= pivot) {
            i++;
        }
        //找到就開始替換,替換完畢開始下一輪找,直至拆分的陣列左右都替換完成
        if (i < j) {
            temp = arr[j];
            arr[j] = arr[i];
            arr[i] = temp;
        }
    }
    //此時基準值還沒動,所以把基準值放到指定位置
    temp = arr[i];//這裡的i和j是重合的,所以用i和j都可以
    arr[i] = arr[left];//這裡為什麼是替換left下標,因為上面的迴圈中,我們是從小到大的順序排序,i的位置一定是小於基準值的
    arr[left] = temp;
    return i;
}

相關文章