本文我準備用Java實現快速排序。具體的排序算法過程已經在註釋裏面了,大家可以複製代碼到IDE裏面,用DEBUG模式研究算法的過程:
import java.util.Arrays;
import java.util.Random;
/**
* @author LiYang
* @ClassName QuickSort
* @Description 快速排序算法
* @date 2019/11/4 11:29
*/
public class QuickSort {
/**
* 快速排序算法(QuickSort)
* @param arr 待排序的數組
* @param low 排序區域的左邊界
* @param high 排序區域的右邊界
*/
public static void quickSort(int[] arr, int low, int high) {
//左邊界即爲左指針
int left = low;
//右邊界即爲右指針
int right = high;
//快排樞紐元,此處我們選左邊第一個數爲樞紐元
int pivot = arr[low];
//左右指針未重合
while(left < right){
//如果左右指針未重合,並且右邊的數字大於等於樞紐元(先從右往左找)
while(left < right && arr[right] >= pivot){
//則該數字不需要移動,右指針往左挪動一位
right --;
}
//如果左右指針未重合
if(left < right){
/*
此時的右指針數字是小於樞紐元的,需要移動到左邊
且現在左指針的數字是樞紐元,已經記錄下來,所以可以直接覆蓋
將右邊的數字賦值給左指針數字,然後右邊數字又相當於空了出來
之後左指針找到的大於樞紐元的數字,又可以直接覆蓋右指針的數字
*/
arr[left] = arr[right];
//此時左指針的數字已經排好序了,就往右挪一位,開始從左往右找
left ++;
}
//如果左右指針未重合,並且左邊的數字小於樞紐元(再從左往右找)
while(left < right && arr[left] < pivot){
//則該數字不需要移動,左指針往右挪動一位
left ++;
}
//如果左右指針未重合
if(left < right){
/*
此時左指針的數字是大於或等於樞紐元,需要放在右邊,
而且右指針的數字是可以覆蓋的,所以可以直接將左指針
的數字賦值給右指針的數字
*/
arr[right] = arr[left];
//此時右指針已經排好序了,就往左挪一位,準備繼續從右往左找
right --;
}
}
/*
大while循環結束,left=right,樞紐元就該在這個位置,且樞紐元左邊的都
小於樞紐元,樞紐元右邊的都大於等於樞紐元,就可以以樞紐元爲分隔,左右
兩邊的子數組再遞歸進行快速排序了,直到所有的子數組長度都爲1
*/
arr[left] = pivot;
//如果左邊的數組長度大於1
if(low < left - 1){
//快排左子數組
quickSort(arr, low, left - 1);
}
//如果右邊的數組長度大於1
if(right + 1 < high){
//快排右子數組
quickSort(arr, right + 1, high);
}
}
/**
* 快速排序(QuickSort)的驅動程序
* @param arr 待排序的數組
*/
public static void quickSort(int[] arr) {
//快速排序的左邊界
int low = 0;
//快速排序的右邊界
int high = arr.length - 1;
//調用快速排序的方法
quickSort(arr, low, high);
}
/**
* 驗證快速排序算法
* @param args
*/
public static void main(String[] args) {
//待排序數組
int[] arr = new int[30];
//隨機數類
Random random = new Random();
//隨機生成排序數組(100以內的整數)
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(100);
}
//打印待排序數組
System.out.println("快速排序前:" + Arrays.toString(arr));
//進行快速排序(調用驅動程序,就是隻有一個參數的quickSort()方法)
quickSort(arr);
//打印快速排序後的數組
System.out.println("快速排序後:" +Arrays.toString(arr));
}
}
運行 QuickSort 類的main方法,快速排序算法測試通過:
快速排序前:[89, 48, 52, 65, 21, 95, 19, 8, 78, 15, 32, 40, 84, 43, 0, 2, 23, 45, 21, 85, 13, 91, 60, 7, 44, 53, 16, 27, 5, 82]
快速排序後:[0, 2, 5, 7, 8, 13, 15, 16, 19, 21, 21, 23, 27, 32, 40, 43, 44, 45, 48, 52, 53, 60, 65, 78, 82, 84, 85, 89, 91, 95]