算法基础课_基础算法_快速排序
快速排序的思想
基于分治的思想:
步骤:
- 确定分界点 q[l], q[l+r >> 1], q[r]
- 调整区间
- 递归处理两个子区间
快速排序的基本模板
//手写一个快排
public static void quick_sort(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;
}
}
//递归处理两边
quick_sort(arr, l, j);
quick_sort(arr, j+1, r);
}
一个小细节:分界点选择左端点, 递归的时候使用j变量,这样可以防止产生边界问题
例题:
AcWing 785. 快速排序
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i ++){
arr[i] = sc.nextInt();
}
quick_sort(arr,0,arr.length-1);
for(int i = 0; i < n; i ++){
System.out.print(arr[i]+" ");
}
}
public static void quick_sort(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;
}
}
quick_sort(arr, l, j);
quick_sort(arr, j+1, r);
}
}
AcWing786 第K个数
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i ++){
arr[i] = sc.nextInt();
}
quick_sort(arr,0,arr.length-1);
for(int i = 0; i < n; i ++){
System.out.print(arr[i]+" ");
}
}
public static void quick_sort(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;
}
}
quick_sort(arr, l, j);
quick_sort(arr, j+1, r);
}
}