排序专项——快速排序

QuickSort

题目https://www.luogu.org/problemnew/show/P1177

快速排序的具体思路就是找一个基准,首先将这个基准放到对应的位置,然后将小于基准的都放到左边,大于基准的放到右边。然后再递归左右区间。

这个代码会RE,可能是递归深度太大,爆栈了。

import java.util.Scanner;

public class Main{
    private int[] num;
    public int size;

    public void get_data(){
        Scanner in = new Scanner(System.in);
        size= in.nextInt();
        num = new int[size];
        for(int i=0;i<size;i++){
            num[i] = in.nextInt();
        }
        in.close();
    }

    public void quick_sort(int l,int r){
        if(l<0||r>=size||l>=r) return;

        int base = num[(l+r)/2];
        num[(l+r)/2] = num[l];
        num[l] = base;

        int cur = num[l];  //base
        int ll = l, rr = r;

        while(ll<rr){
            while(num[rr]>=cur&&ll<rr){
                rr--;
            }
            if(num[rr]<cur){
                num[ll] = num[rr];
                //the num[rr] is useless
            }
            while(num[ll]<=cur&&ll<rr){
                ll++;
            }
            if(num[ll]>cur){
                num[rr] = num[ll];
                //the num[ll] is useless
            }
        }

        if(ll==rr) num[ll] = cur;
        quick_sort(l,ll-1);
        quick_sort(ll+1,r);
    }

    public void output(){
        for(int i=0;i<size;i++){
            System.out.print(num[i]+" ");
        }
        System.out.println();
    }

    public static void main(String arg[]){
        Main obj = new Main();
        obj.get_data();
        obj.quick_sort(0,obj.size-1);
        obj.output();
    }
}

改为非递归形式

package OJ;

import java.util.Scanner;

public class Main{
    private int[] num;
    public int size;

    public void get_data(){
        Scanner in = new Scanner(System.in);
        size= in.nextInt();
        num = new int[size];
        for(int i=0;i<size;i++){
            num[i] = in.nextInt();
        }
        in.close();
    }

    public int quick_sort(int l,int r){
        if(l<0||r>=size||l>=r) return -1;

        int base = num[(l+r)/2];
        num[(l+r)/2] = num[l];
        num[l] = base;

        int cur = num[l];  //base
        int ll = l, rr = r;

        while(ll<rr){
            while(num[rr]>=cur&&ll<rr){
                rr--;
            }
            if(num[rr]<cur){
                num[ll] = num[rr];
                //the num[rr] is useless
            }
            while(num[ll]<=cur&&ll<rr){
                ll++;
            }
            if(num[ll]>cur){
                num[rr] = num[ll];
                //the num[ll] is useless
            }
        }

        if(ll==rr) num[ll] = cur;

        return ll;
    }

    public void sort(){
        int[] stack = new int[400000]; //递归深度
        int top = 0;

        stack[++top] = 0;
        stack[++top] = size-1;
        while(top>0){

            int r = stack[top--];
            int l = stack[top--];

            int mid = quick_sort(l,r);
            if(mid-1>l){
                stack[++top] = l;
                stack[++top] = mid-1;
            }
            if(mid+1<r){
                stack[++top] = mid+1;
                stack[++top] = r;
            }
        }
    }

    public void output(){
        for(int i=0;i<size;i++){
            System.out.print(num[i]+" ");
        }
        System.out.println();
    }


    public static void main(String arg[]){
        Main obj = new Main();
        obj.get_data();
        obj.sort();
        obj.output();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值