问题描述
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
第一行为一个整数n。
第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
时间限制:1.0s
内存限制:512.0MB
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
int[] a = new int[n];
for(int i = 0; i < n; i++) {
a[i] = s.nextInt();
}
s.close();
quickSort(a, 0, a.length - 1);
for(int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
// 快排
public static void quickSort(int[] a, int low, int high) {
if(high <= low) {
return;
}
int j = partition(a, low, high); // 找到j的位置
quickSort(a, low, j - 1);
quickSort(a, j + 1, high);
}
// 找到属于a[low](v)的最终位置j,即处理后a[low]~a[j-1]都不大于v,a[j+1]~a[high]都不小于v
private static int partition(int[] a, int low, int high) {
int i = low;
int j = high + 1;
int v = a[low];
while(true) {
while(a[++i] < v) {
if(i == high) {
break;
}
}
while(v < a[--j]) {
if(j == low) {
break;
}
}
if(i >= j) {
break;
}
int tem = a[i];
a[i] = a[j];
a[j] = tem;
}
int tem = a[low];
a[low] = a[j];
a[j] = tem;
return j;
}
}