题目描述
给定你一个长度为n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。
输出格式
输出共一行,包含 n 个整数,表示排好序的数列。
数据范围
1≤n≤100000
样例
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
算法1(双指针法)
思路
1.从数组中选择一个随机值X
2.用核心算法使得数组左边<=X,右边>=X
3.递归左右两边
核心算法
用i,j两个初始指针分别指向数组头尾两端,分别向中间移动,
如果a[i]不小于X、a[j]不大于X,则交换。直到i,j相遇。
时间复杂度
$O(nlogn)$
Java 代码
import java.util.*;
public class Main{
private static int N = 100010;
private static int[] a = new int[N];
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for(int i = 0; i < n; i++ ){
a[i] = scanner.nextInt();
}
int l = 0,r = n - 1;
quickSort(a,l,r);
for(int i = 0; i < n; i++ ){
System.out.print(a[i] + " ");
}
}
public static void quickSort(int[] a,int l,int r){
if(l >= r){
return;
}
int x = a[l + r >> 1];
int i = l - 1, j = r + 1;
//核心算法
while(i < j){
do{
i++;
}while(a[i] < x);
do{
j--;
}while(a[j] > x);
if(i < j){
swap(a,i,j);
}
}
quickSort(a,l,j);
quickSort(a,j+1,r);
}
public static void swap(int[] a,int i ,int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}