快速排序
快速排序的核心思想:
- 确定分界点,可以是q[l],q[(l+r)/2]或q[r],我们选用q[l]
- 调整区间,就是将就是把所有比分界点大的放到右边,所有比分界点小的放到左边
- 如何调整?双指针,一个从左往右走知道找到比分界点大的,一个从右往左…
- 找到后,交换,再继续走,直到两指针相遇
- 递归处理
模板
public static void quickSort(int[] arr, int l, int r) { if(l>=r) return; int p = arr[l]; int i = l-1; int j = r+1; 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; } } quickSort(arr, l, j); quickSort(arr, j+1, r); }
|
题目
AcWing的两道题
- P785 快速排序 套用模板即可,只需要写输入输出部分
- P786 第k个数
P786 第k个数
题目描述
给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列的第k小的数是多少。
输入格式
第一行包含两个整数 n 和 k。
第二行包含 n 个整数(所有整数均在1~10^9范围内),表示整数数列。
输出格式
输出一个整数,表示数列的第k小数。
数据范围
1≤n≤100000
1≤k≤n
输入样例:
输出样例:
题目解答
import java.util.*; import java.io.*;
public class Main { public static void main(String[] args)throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] str = br.readLine().split(" "); int n = Integer.parseInt(str[0]); int k = Integer.parseInt(str[1]); int[] arr = new int[n]; String[] Line = br.readLine().split(" "); for(int i=0;i<n;i++) { arr[i]=Integer.parseInt(Line[i]); } quickSort(arr, 0, n-1); System.out.println(arr[k-1]); } public static void quickSort(int[] arr, int l, int r){ if(l >= r) return; int p = arr[l]; int i = l - 1; int j = r + 1; 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; } } quickSort(arr, l, j); quickSort(arr, j+1, r); } }
|
总结:
其实快速排序也被java内部集成在工具类Arrays中了
不过学习快排最重要的就是要掌握快排的递归思想,这也是后面很多算法学习的基础
Others:
人无完人,何况是小白Chen我呢,文章难免会出现一些错误,若是读者们发现错误,可以评论或者联系我,Chen会尽力改正,给大家更优秀的博文。