快速排列的一些注意事项!

这里用到了快速排列的思想和递归的思想(这里看不懂的代码里面会详细的讲解)
快速排列的思想主要是:
1.将数组里面的第一个数字作为基准数字(后面的基准数字都统一叫做基数)
2.剩余数字开始和基数比较.
注意:这里的比较比较特殊.分为左右两条线路进行比较
先说左边的,这里需要从数组的左边开始查找,找到一个比基准数字大的数.(叫做左数)
再说右边的,从数组的右边开始查找,找到一个比基准数字小的数.(叫做右数)
找到之后将左数和右数进行交换.
而后继续找,直到左右两边查找到同一个数字了(叫做中数)
此时,将基数与中数交换,那么此时就会得到基数左边都比基数小,右边都比基数大(就确定了一个数字的准确位置了)
3.继续利用这种思想,但是此时可以将数组分成两部分来查了,同样是这个思路(既然是同一个思路,那么代码也应该是相似的,此时就可以重复调用该方法.这种思想也就是递归),这也就可以快速排列数字了,也就是快速排列.
看代码:

public class Test3 {
    //给定一个整数数组,实现快速排序算法进行升序排序:如{2,5,8,9,3}
    public static void main(String[] args) {
        int[] arr = {3, 5, 7, 6, 4};//这里给定一个数组
        //这里为了能够重复的调用这个方法.
        // 将此方法的3个参数分别设置成了数组,左边索引,和右边索引.
        //这样一来我们在重复调用的时候就会方便许多.(方便在可以将数组人为的分成2部分).
        //继续看这个querySort方法怎么写的.
        querySort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
    //querySort方法在这里!
    public static void querySort(int[] arr, int left, int right) {
        if (right < left) {
            return;
        }
        //这里为了方便下面的使用,将传进来的参数进行保留.
        int left0 = left;//左边的索引数据保留
        int right0 = right;//右边的索引数据保留
        //这里我们还有确定基准数字
        int baseNum = arr[left];
        //来个循环,结束标志是:右边和左边相同,一旦相同就代表找到可以和基准数字换位的数了
        while (right != left) {
            //找到右边的某个数比基准数小的
            //里面的条件很重要,首先要保证右边找到的数字小于等于基数,同时保证右边索引大于左边索引
            //如果找到了比基数小的就停下来,等左边的找.左边找不到比基数小的了,然后也找到了这个数,那么此时两个索引都相同过了,就可以结束这这循环了.
            //注意:为什么一定要从右边开始查?
            //从右边开始查,如果没有比基数小的,会找到基数自身,此时基数的位置本身就是正确的.
            //假设从左边开始查的话,左边找一个大于等于基数的,此时左索引会直接在基数位置停下,
            //右索引开始来找,以此案例来说,就会一直找到7.找到之后,左索引又往右走了一步,发现左右索引碰头了
            //此时就会将3和7进行交换,但是此时已经发生了错误.因此不能从左边开始进行查找.
            while (arr[right] >= baseNum && right > left) {
                right--;
            }
            //找到左边某个数比基准数大的
            while (arr[left] <= baseNum && right > left) {
                left++;
            }
            //这里是左边找到了比基数大了,右边比基数小的.此时将两个数字进行交换
            //两个数交换位置
            int temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
        }
        //结束循环后将基准数换到中间
        int temp = arr[left];
        arr[left] = arr[left0];
        arr[left0] = temp;
        //此时第一个数字就确定了自己的位置了,那么用同样的方法来进行排列
        //此时将一个数组分成了两个数组进行查询了.速率大大加快了
        querySort(arr, left0, left - 1);
        querySort(arr, left + 1, right0);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值