publicvoidquickSort(int[] arr, int left, int right) { if (left >= right) return; intpivot= partition(arr, left, right); quickSort(arr, left, pivot - 1); quickSort(arr, pivot + 1, right); }
intpartition(int[] arr, int left, int right) { intpivot= arr[right]; // 选最后一个为基准 inti= left; for (intj= left; j < right; j++) { if (arr[j] <= pivot) { swap(arr, i++, j); } } swap(arr, i, right); return i; }
3.3 随机化优化
intpartitionRandom(int[] arr, int left, int right) { intrandomIdx= left + newRandom().nextInt(right - left + 1); swap(arr, randomIdx, right); return partition(arr, left, right); }
3.4 三数取中法
选择left、mid、right三个位置的中值作为pivot,避免极端情况。
3.5 双路快排(处理大量重复元素)
intpartition2Way(int[] arr, int left, int right) { intpivot= arr[left]; inti= left + 1, j = right; while (true) { while (i <= right && arr[i] < pivot) i++; while (j >= left + 1 && arr[j] > pivot) j--; if (i > j) break; swap(arr, i++, j--); } swap(arr, left, j); return j; }
3.6 三路快排(大量重复元素最优)
voidquickSort3Way(int[] arr, int left, int right) { if (left >= right) return; intpivot= arr[left]; intlt= left, gt = right, i = left + 1; while (i <= gt) { if (arr[i] < pivot) swap(arr, i++, lt++); elseif (arr[i] > pivot) swap(arr, i, gt--); else i++; } quickSort3Way(arr, left, lt - 1); quickSort3Way(arr, gt + 1, right); }