洛谷链接:https://www.luogu.com.cn/problem/P1177
注意:传统快排过不了,必须优化。java中交换函数也和c语言不一样,运用二分法,比传统快排快。
import java.util.Scanner;
public class Main {
public static int[] a=new int[100001];
//交换
private static void swap(int[] data,int i, int j) {
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
public static void quicksort(int l,int r) {
//应用二分思想
int mid=a[(l+r)/2]; //中间数
int i=l,j=r;
do {
while(a[i]<mid) i++; //查找左半部分比中间数大的数
while(a[j]>mid) j--; //查找右半部分比中间数小的数
if(i<=j) {
//如果有一组不满足排序条件(左小右大)的数
swap(a,i,j); //交换
i++;
j--;
}
}while(i<=j);
if(l<j) quicksort(l,j); //递归搜索左半部分
if(i<r) quicksort(i,r); //递归搜索右半部分
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int n=in.nextInt();
for(int i=1;i<=n;i++) {
a[i]=in.nextInt();
}
quicksort(1,n);
for(int i=1;i<=n;i++) {
System.out.print(a[i]+" ");
}
}
}