基本算法——快速排序

目标:掌握快排和java中的快排函数

  • AcWing P785 快速排序
  • AcWing P786 第k个数

目录

      • 1. 快排
      • 2. Arrays.sort

1. 快排

快排的核心思想:

  • 确定分界点,可以是q[l],q[(l+r)/2]或q[r],我们选用q[l]
    • 调整区间,就是将就是把所有比分界点大的放到右边,所有比分界点小的放到左边
  • 如何调整?双指针,一个从左往右走知道找到比分界点大的,一个从右往左…
    • 找到后,交换,再继续走,直到两指针相遇
  • 递归处理 步骤2结束后,再次递归分界点两边的区间

基本算法——快速排序_第1张图片

// 参数解释:
// 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中就有写好的快排,手写快排主要运用在面试中

基本算法——快速排序_第2张图片

你可能感兴趣的:(算法学习,算法,排序算法,快速排序)