快速排序 及(我自己在快速排序中遇到的问题)

本文通过一个具体的快速排序代码示例,详细解释了快速排序的步骤和运行逻辑。作者在实践中遇到了关于边界条件判断的问题,并通过调试找到了答案。博客强调了在while循环中使用'<='而不是'<'的原因,即为了确保找到小于基准数字的元素。通过这个例子,读者可以更好地理解快速排序的工作原理。
摘要由CSDN通过智能技术生成

1.例题源码

   public static void main(String[] args) {
        //快速排序
        int[] num = {20,40,32,67,40,20,89,300,400,15};
        sort(num,0,num.length-1);

        for (int i : num) {
            System.out.print(i + " ");
        }
    }
    public static void sort(int[] num, int min ,int max){

        //索引越界 跳出
        if(min > max){
            return;
        }

        int i =min;
        int j =max;
        //将第一个数子作为参考数字
        int first = num[min];
        int temp;

        while (i<j) {
            //先看右边,依次往左递减
            while (first<=num[j]&&i<j) {
                j--;
            }
            //再看左边,依次往右递增
            while (first>=num[i]&&i<j) {
                i++;
            }
            //如果满足条件则交换
            if (i<j) {
                temp = num[j];
                num[j] = num[i];
                num[i] = temp;
            }

        }
        //将i j 相等时的数字座位基准数字
        num[min] = num[i];
        //将基准数字 与 i j 相等时位置上的数字交换
        num[i] = first;

        //递归调用排序左边
        sort(num,min, j - 1);
        //递归调用排序右边
        sort(num,j+1,max);
    }
排序的结果:15 20 20 32 40 40 67 89 300 400 

2.我所遇到的问题(我是初学菜鸡)

快速排序的步骤:

  1. 假设第一位为基准数(参考的数字)
  2. 从数组的最右边开始查找(j),找的是比基准数字小的数字(ps:如果是从小到大排列的话)
  3. 从数组的最左边开始查找(i),找的是比基准数字大的数字(ps:如果是从小到大排列的话)
  4. 交换两个找的数字, 继续循环交换两位数字直到 i = j 时,将此时i位置上对应数字作为基准数字,交换上一位基准数字和此时i位置上对应的数字。
  5. 递归调用重复以上的步骤

我的问题:

while (first<=num[j]&&i<j) {
    j--;
}
//不是应该从右边开始找的是小于基准数字的数吗这里为什么写 <= 呢?

经过Debugger后,原来是大于基准数数就不会进入循环(哈哈哈)这里的j就不会发生变化,就能       找到小于基准数字的数 

   问题总结:是我没有理清快速排序当(i<j)时while循环内部的运行流程 emo---.                                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值