算法:用Java實現快速排序(QuickSort)

本文我準備用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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章