题目:785. 快速排序 - AcWing题库
思路/想法:
快速排序:分治思想
①确定分界点:q[l]、q[r]、q[(l+r)/2]、随机点。例如:取个随机值x。
②调整区间:将x作为分割点,使得x左区间小于等于x,x右区间大于等于x。
③递归处理左右两个区间:
暴力做法:两个数组分别装x左右两个区间的值
双指针优化:两个指针i,j分别指向左右元素,左右分别循环向中间靠拢,当i位置的值大于x时则停止,j开始循环直到j对应的值小于x,则交换i/j两个位置的值。
代码实现:
import java.util.*;
public class Main {
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] q = new int[n];
for (int i = 0; i < n; i++) {
q[i] = sc.nextInt();
}
quickSort(q, 0, n - 1);
for (int i = 0; i < n; i++) {
System.out.print(q[i] + " ");
}
}
public static void quickSort(int[] q, int l, int r) {
if (l >= r) return;
int x = q[(l + r) / 2], i = l - 1, j = r + 1;
while (i < j) {
while (q[++i] < x);
while (q[--j] > x);
if (i < j) {
int t = q[i];
q[i] = q[j];
q[j] = t;
}
}
quickSort(q, l, j);
quickSort(q, j + 1, r);
}
}