Acwing题目:www.acwing.com/activity/co…
快速排序的思想是基于分治
逻辑是:
- 确定分界点
q[l]、 q[l+r >> 1]、 q[r], 反正就是确定一个值 - 基于值进行区间调整,最后形成,左边的区间 <
q[l + r >> 1],右边的区间 >q[l + r >> 1]这一步如何实现就是核心 - 递归,我们的左右区间
我们对于2有几种做法:
- 第一种暴力的做法:开两个数组
a[],b[],扫描一遍,小于放到a,大于放到b,然后再把a,b的值给回q。时间复杂度O(n),相当于扫描了2遍 - 第二种,两个指针,参考下面的实现,就是i,j两个指针,分别找到不符合我们逻辑的值,就进行交换,直到i和j相遇为止
package org.acwing.basic;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] arr = {5, 4, 3, 2, 1};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
// 确定分界点
int x = arr[left + right >> 1];
// 两个边界点, 我们使用do while
int i = left - 1;
int j = right + 1;
while (i < j) {
do {
i++;
} while (arr[i] < x);
do {
j--;
} while (arr[j] > x);
// 移动后确实有不符合的,进行交换
if (i < j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
// 递归 这里最好是j,避免边界问题
quickSort(arr, left, j);
quickSort(arr, j + 1, right);
}
}