Que01|785. 快速排序

68 阅读1分钟
题目:785. 快速排序 - AcWing题库
思路/想法:

快速排序:分治思想

①确定分界点:q[l]、q[r]、q[(l+r)/2]、随机点。例如:取个随机值x。

②调整区间:将x作为分割点,使得x左区间小于等于x,x右区间大于等于x。

③递归处理左右两个区间

暴力做法:两个数组分别装x左右两个区间的值 image.png 双指针优化:两个指针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);
    }
}