演算法之快速排序

meimengxing發表於2022-11-23

演算法之快速排序


基本思想

快速排序基本思想:對一組無序的資料隨機取一個作為基準數,然後進行一次排序,劃分成左右兩個部分。左邊區間的數比基準數小,右邊的數比基準數大,然後再使用同樣的方法對左右區間在各自進行排序,就能得到有序的序列。


演算法設計

(1).隨機取一個數記作基準數key,一般使用陣列第一個數。

(2).定義首尾兩個指標,尾指標向前搜尋,找到小於等於key的數,然後放到首指標所在的位置,並讓首指標位置往後移一位。
首指標向後搜尋,找到大於key的數,然後放到尾指標所在的位置,並讓尾指標位置往前移一位。

如果在查詢中找不到對應的值,則繼續往下查詢。

(3).重複第二個步驟,直到首尾指標相遇,此時一輪排序結束。

(4).一輪排序結束後,需要把中位數的值放到最後的坑位。


案例程式碼

//Java實現
public class QuickSort {

public static void solutionHole(int[] arr,int begin,int end){

    if(begin >= end){
        return;
    }
    //取一箇中間值
    int mid = arr[begin];
    //定義首尾指標
    int left = begin;
    int right = end;

    while (left<right){
        //右區間查詢比mid小的數,放到左邊
        while (left < right && arr[right]>mid){
            right--;
        }
        if(left < right){
            arr[left] = arr[right];
            left++;
        }
        //左區間查詢比mid大的數,放到右邊
        while (left < right && arr[left]<mid){
            left++;
        }
        if(left < right){
            arr[right] = arr[left];
            right--;
        }
        //兩個指標重疊時,查詢完畢,把中位數的值放進去
        if(left == right){
            arr[left] = mid;
        }
        System.out.println(Arrays.toString(arr));
    }
    //遞迴呼叫,分別對左右區間在排序一次
    solutionHole(arr,begin,left-1);
    solutionHole(arr,right+1,end);

}

public static void main(String[] args) {
    int [] arr = {47,29,71,99,78,19,24,19};
    int begin = 0;
    int end = arr.length-1;
    solutionHole(arr,begin,end);
}
}


注意點

  • 先從右邊開始查詢,在到左邊,順序不能亂。
  • 查詢完之後當前指標位置不變,然後交替移動指標位置。
  • 排序結束後需要把基準值填入最後的坑位,並對左右區間在進行排序。
  • 有兩種解法:交換法和挖坑法,兩種實現方式不太一樣,這裡以挖坑法為主。
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章