Java快排栈溢出?

 

 会出现栈溢出

 把代码改成

就可以正常排序 

快速排序完整源代码:

package T5;

public class QuickSort {
    int a[];
    public QuickSort() {
        a = new int[]{8,19,2,3,100,99,1000,888,-1,0};
    }
    public QuickSort(int a[]) {
        this.a = a;
    }
    //分区:i是左边界,j是右边界
    int partition(int a[],int i,int j,int size){
        //把小于m的放在m的左边,大于等于m的放在m的右边
        int m=a[i];
        while(i<j){
            //从右往左,查找小于m的元素
            while(i<j && a[j]>=m){
                j--;
            }
            if(i<j){
                a[i++]=a[j];
            }
            //从左往右,查找大于m的元素
            while(i<j && a[i]<m){
                i++;
            }
            if(i<j){
                a[j--]=a[i];
            }
        }
        a[i]=m;
//        print();
        return i;
    }
    //排序
    public void quickSort(int a[],int left,int right,int size){
        if(left<right){
            int pos = partition(a, left, right, size);
            //左边区块
            quickSort(a, left, pos-1, size); //调用很多次
            quickSort(a, pos+1,right, size);//调用很多次
        }
//        else{
//            System.out.println("排序结束");
//        }
    }
    public void print(){
        for (int e : a) {
            System.out.print(e+"\t");
        }
        System.out.println("");
    }
    public static void main(String[] args) {
        /*8,19,2,3,100,99,1000,888,-1,0
         * m=a[0]=8
         * i=0,j=9
         * 从右往左:m=a[0]=8,i=0,j=9 a[j]=a[9]=0<m
         * 0,19,2,3,100,99,1000,888,-1,0    m=8,i=1,j=9
         * 0,19,2,3,100,99,1000,888,-1,19    m=8,i=1,j=8
         * 0,-1,2,3,100,99,1000,888,-1,19    m=8,i=2,j=8
         * 0,-1,2,3,100,99,1000,888,100,19    m=8,i=4,j=7
         * 0,-1,2,3,100,99,1000,888,100,19    m=8,i=4,j=4
         * 0,-1,2,3,8,99,1000,888,100,19
         */
        QuickSort sort = new QuickSort();
        System.out.println("排序前数据顺序:");
        sort.print();
        long start = System.currentTimeMillis();
        sort.quickSort(sort.a, 0, sort.a.length-1, sort.a.length);
        sort.print();
        long end = System.currentTimeMillis()-start;
        System.out.println("排序用时:"+end +"毫秒");
    }
}
 

Quick sort算法中的partition()函数。分区功能可获取一个枢轴元素,将其放置在右侧位置,将所有小于枢轴元素的元素向左移动,并将所有比枢轴元素大的元素向右移动。Quicksort需要花费线性时间。
然后将数组从数据透视元素中分为两部分(即,小于数据透视元素的元素和大于数据透视元素的元素),并使用Quicksort算法对两个数组进行递归排序。


 

 

high值是不断变化的并非是  array.length;

array.length一直是一个固定值

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y