基本思想
快速排序基本思想:對一組無序的資料隨機取一個作為基準數,然後進行一次排序,劃分成左右兩個部分。左邊區間的數比基準數小,右邊的數比基準數大,然後再使用同樣的方法對左右區間在各自進行排序,就能得到有序的序列。
演算法設計
(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 協議》,轉載必須註明作者和本文連結