以末尾作为基准值(经典模版)
无需多言,直接上代码
private void quickSort(int[] nums, int l, int r) {
if (l >= r) {
return;
}
int slow;
int fast;
slow = fast = l;
int pivot = nums[r];
while (fast < r) {
if (nums[fast] < pivot) {
swap(nums, slow, fast);
slow++;
}
fast++;
}
swap(nums, slow, r);
quickSort(nums, l, slow - 1);
quickSort(nums, slow + 1, r);
}
private void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
如何理解呢?slow始终维护一个大于基准值的位置,fast就一直往后找,找到小于基准值的位置,就让两者交换,如此便可以将小的值移到前面,大的值移到后面
范围内随机一个值作为基准值(更加稳定)
其实模版可以是相同的,直接将某个随机值和末尾元素交换,然后按照模版写就行了
private void quickSort(int[] nums, int l, int r) {
if (l >= r) {
return;
}
int slow;
int fast;
slow = fast = l;
Random random = new Random();
int index = random.nextInt(r - l + 1) + l;
int pivot = nums[index];
swap(nums, index, r);
while (fast < r) {
if (nums[fast] < pivot) {
swap(nums, slow, fast);
slow++;
}
fast++;
}
swap(nums, slow, r);
quickSort(nums, l, slow - 1);
quickSort(nums, slow + 1, r);
}
private void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}
结论
简单而言,只需要每次确定一个基准值,然后把基准值的位置找准
在保证小于基准值的在左边,大于基准值的在右边就行了