基本算法——快速排序
作者:互联网
目标:掌握快排和java中的快排函数
- AcWing P785 快速排序
- AcWing P786 第k个数
目录
1. 快排
快排的核心思想:
- 确定分界点,可以是q[l],q[(l+r)/2]或q[r],我们选用q[l]
- 调整区间,就是将就是把所有比分界点大的放到右边,所有比分界点小的放到左边
- 如何调整?双指针,一个从左往右走知道找到比分界点大的,一个从右往左…
- 找到后,交换,再继续走,直到两指针相遇
- 递归处理 步骤2结束后,再次递归分界点两边的区间
// 参数解释:
// 1. int[] arr 需要排序的数组
// 2. int l 排序的左端点
// 3. int r 排序的右端点
// 举例: 你要排序一个 int[] arr = {1,5,3,2,6} 数组内全部要排序,l=0,r=arr.length-1
public static void quickSort(int[] arr, int l, int r)
{
//递归结束 条件
if(l>=r) return;
//1. 确定分界点
int p = arr[l]; //我们取左端点
//确定边界 +1-1是应为我们使用的do-while,开始前就会i++和j--
int i = l-1;
int j = r+1;
//2. 调整区间
while(i < j){
do{
i++;
}while(arr[i] < p); //记得分号;
do{
j--;
}while(arr[j] > p);
//找到两个不符合定义的点,即左边找到一个比分界点大的,右边找到一个比分界点小的
//交换
if(i < j){ //别忘了,很关键,两个指针还没有重合或穿过
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
//3. 递归处理
quickSort(arr, l, j);
quickSort(arr, j+1, r);
//此处为了边界不出问题,我们边界点一开始取q[l],那么递归的时候就l~j 和 j+1~r
//这样就不会出现边界问题
}
2. Arrays.sort
事实上、在java的api中就有写好的快排,手写快排主要运用在面试中
标签:分界点,arr,递归,int,快排,算法,排序,快速 来源: https://blog.csdn.net/qq_39285571/article/details/106289844