快速排序--

本文详细介绍了快速排序算法的工作原理,通过一个具体的例子展示了如何选取基准数并进行数组调整的过程。快速排序通过设置基准点,将数组分为两部分,确保基准点左边的元素都小于等于基准点,右边的元素都大于等于基准点,从而达到排序的目的。文章还提供了Java代码实现,并进行了递归调用来完成整个数组的排序。
摘要由CSDN通过智能技术生成

public class QuickSort {

    public static void quickSort(Integer[] arr, int low, int height) {
        /***
         * j先从右往左找一个小于6的数,i再从左往右找一个大于6的数,然后交换他们。
         * 这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。
         * 刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。
         * 基准数是 [6]
         *    i=1           j=10
         *  6 1 2 7 9 3 4 5 10 8
         *
         *  j先出动 向左移动j-- ,i向右移动i++ 直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。交换位置
         *    6 1 2 7 9 3 4 5 10 8
         *
         *   6 1 2 [5] 9 3 4 [7] 10 8
         *
         *   6 1 2 5 [4] 3 [9] 7 10 8
         *
         *   j先走走到3, i走到3 交换基准数
         *
         *   6 1 2 5 [4] 3 [9] 7 10 8
         *
         *   [3] 1 2 5 4 [6] 9 7 10 8
         *
         *   快速排序之所比较快,因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,
         *   将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边
         *   序列以3为基准数进行调整,使得3(基准数)左边的数都小于等于(基准数)3,3(基准数)右边的数都大于等于(基准数)3
         *   (1 2 [3] 5 4)
         */

        // temp 作为基准数 t为中间交换赋值
        int i, j, temp, t;
        if (low > height) {
            return;
        }
        i = low;
        j = height;
        // temp作为基准数
        temp = arr[low];

        while (i < j) {

            //先看右边,依次往左递减 j--(基准数右边)
            while (temp <= arr[j] && i < j) {
                j--;
            }
            // 再看左边 依次向右递增 i++ (基准数左边)
            while (temp >= arr[i] && i < j) {
                i++;
            }

            //如果满足条件则交换
            if (i < j) {
                t = arr[j];
                arr[j] = arr[i];
                arr[i] = t;
            }
        }
        //最后将基准为与i和j相等位置的数字交换
        arr[low]=arr[i];
        arr[i]=temp;

        //递归调用左半数组
        quickSort(arr, low, j-1);
        //递归调用右半数组
        quickSort(arr, j+1, height);
    }

    public static void main(String[] args){
        Integer[] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};

        quickSort(arr, 0, arr.length-1);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值