快速排序
1. 基本思想
选取一个中心轴pivot,左边的数都比pivot小,右边的数都比pivot大。
- 选取一个数字作为中心轴pivot,一般选数组第一个。
- 定义两个变量(指针),左指针,右指针,来进行操作。
- 先右指针往前找,如果当前数大于pivot则说明不需要动,然后继续往前找,直到找到一个数小于pivot,然后把这个数放到左指针的位置,然后右指针不动。
- 接着左指针开始往后找,如果当前数小于pivot说明不需要动,然后继续往后找,直到找到一个数大于pivot,然后把这个数放到右指针的位置,然后左指针不动。
- 然后一直重复3、4步骤,直到左右指针在同一个位置,然后把pivot放在这个位置,就完成首次排序。
- 接着中心轴的左右两边在继续排,重复1、2、3、4、5步骤。
- 一直重复6步骤,停止条件为pivot左边和右边的数字个数为1。
2. 代码
public static void quickSort(int[] nums, int l, int r) {
if (l >= r) return ; //出口条件
int left = l, right = r; //定义左右指针
int pivot = nums[left]; //定义中心轴,一般取数组第一个为中心抽
while (left < right) {
// 先从右指针开始,往前找,如果当前的数小于pivot则把他放在左指针上,如果没找到则继续往前找
while (nums[right] >= pivot && left < right) {
right--;
}
//出这个循环了,说明找到了,就把当前的值放在左指针的位置上
nums[left] = nums[right];
// 开始左指针往后找,如果当前的数大于pivot则把他放在右指针上,如果没有找到则继续
while (nums[left] <= pivot && left < right) {
left++;
}
nums[right] = nums[left];
if (left == right) {
// 当左指针位置和右指针位置重合时,说明当前排序结束(左区间都比pivot小,右区间都比pivot大)
// 则pivot放到这个位置
nums[left] = pivot;
}
}
// 在左区间继续进行上述步骤进行排序
quickSort(nums, l, right - 1);
// 在右区间继续进行上述步骤进行排序
quickSort(nums, right + 1, r);
}