public class QuickSort {
/**
* 双指针排序:
* 1、找基准数:先默认第0位(可优化:随机选三个用中间值)
* 2、右指针要大于左指针
* 3、右指针左移找到比基准值小的
* 4、左指针右移找到比基准值大的
* 5、交换左右指针所指位置的值
* 6、两指针重合后交换指向位置的值和基准数的值
* 7、将基准值左面的数组也执行1-6步骤、右面的数组也执行1-6步骤。
* <p>
* 时间复杂度:O(NlogN) 最坏:O(N^2)
* 空间复杂度:O(N)
* 稳定性:不稳定
*
* @param arr
* @param left
* @param right
*/
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int min = right;
int max = left;
int pivot = arr[left];
while (min != max) {
//从右往左扫描找小于基准数的位置
while (arr[min] > pivot && min > max) {
min--;
}
//从右往左扫描找小于基准数的位置
while (arr[max] <= pivot && min > max) {
max++;
}
//如果右指针大于左指针 那说明找到了就交换
if (min > max) {
arr[min] = arr[min] + arr[max];
arr[max] = arr[min] - arr[max];
arr[min] = arr[min] - arr[max];
}
}
arr[left] = arr[min];
arr[max] = pivot;
//分治大法
quickSort(arr, left, max - 1);
quickSort(arr, max + 1, right);
}
public static void main(String[] args) {
int[] a = {4, 3, 1, 4, 5, 6, 3, 6, 3, 4, 6, 2, 1};
quickSort(a, 0, a.length - 1);
for (int i : a) {
System.out.println(i);
}
}
}