public void quickSort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
quickSort(arr, 0, arr.length - 1);
}
public void quickSort(int[] arr, int l, int r) {
if (l < r) {
swap(arr, l + (int) (Math.random() * (r - l + 1)), r);//随机快速排序,每次得到一个l到r的值,和下标r处的值交换,防止出现
int[] p = partition(arr, l, r);
quickSort(arr, l, p[0] - 1);
quickSort(arr, p[1] + 1, r);
}
}
public int[] partition(int[] arr, int l, int r) {
int less = l - 1;
int more = r;//选定的对比值
while (l < more) {
if (arr[l] < arr[r]) {
swap(arr, ++less, l++);//小于区扩充一个,和less的下一个交换,指针往下走一个
} else if (arr[l] > arr[r]) {
swap(arr, --more, l);//大于的时候把大于区more向左移一个单位,并和左端交换
} else {
l++;//等于的时候,指针直接下移一个
}
}
swap(arr, more, r);
return new int[] { less + 1, more };//等于区的左端位置和等于区的右端位置
}
public void swap(int[] arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
如果每次选择划分值比较平均的划分为左右两个部分,时间复杂度能达到最优O(nlogn)
相反,如果每次选择的划分值只划分为左部分或者右部分,或者左部分和右部分的个数相差很大,时间复杂度会达到O(n^2)、所以快排的优化是选择随机划分值。