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();
}
}