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