关于数据结构的快速排序,基准数出错的问题!与数组溢出。

关于快速排序,基准数出错的问题!
注意就是在找基准数的左右部分 必须先end 再start的顺序 ,不然会出错,不过还有补救措施!!
package paixusaunfa;
import java.util.Random;
import demo11.random;
public class 快速排序 {
    public static void main(String[] args) {
        /*
        快速排序:
        第一轮:以0索引的数字为基准数,确定基准数在数组中正确的位置。
        比基准数小的全部在左边,比基准数大的全部在右边。
        后面以此类推。
        */
        // TODO Auto-generated method stub
        int[] arr={6,1,2,7,9,3,4,5,10,8};
        quickSort(arr,0,arr.length - 1);
        for(int i=0;i<arr.length;i++) {
            System.out.print(arr[i]+" ");
        }
    }
    public static void quickSort(int[] arr,int i,int j) {
        int start = i;
        int end = j;
        
        if(start>=end) return;//递归出口
        
        int temp = arr[i];
        
        while(start!=end) {
            //!!!!!!注意必须先end 再start ,不然会出错,不过还有补救措施
            while(true) {
                if(arr[end]<temp||end<=start) {
                    break;
                }
                end--;
            }
            while(true) {
                if(arr[start]>temp||end<=start)
                {
                    break;
                }
                start++;
            }

            
            int temp1 = arr[start];
            arr[start] = arr[end];
            arr[end] =temp1;
        }
        //当start和end指向了同一个元素的时候,那么上面的循环就会结束
        //表示己经找到了基准数在数组中应存入的位置
        //基准数归位
        //就是拿着这个范围中的第一个数字,跟start指向的元素进行交换
        int temp2 = arr[i] ;
        arr[i] = arr[start];
        arr[start] = temp2;
        
        //确定6左边的范围,重复刚刚所做的事情
        quickSort(arr,i,start-1);
        
        //确定6右边的范围,重复刚刚所做的事情
        quickSort(arr,start+1,j);
    }
}

下面是先start 再end的补救措施!便是调整递归体部分的基准数的位置。

如 荧光笔的部分是修改基准数的解决方法。

溢出的话可能就是递归出口的范围出问题了。以下便是我自己修改后可运行的。

就是这里对start要大于等于。

希望对某些博友有用。菜鸟第一次写博客如果觉得有用能够解决问题 麻烦给小弟点个赞留个反馈哦! 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值