递归&分治:
1、理论:递归 & 分治 - OI Wiki
2、题目:
题目描述
给定n个无序数和一个整数k,1<=k<=n,要求找出这n个数中第k小的数(保证这n个无序数无相同元素)
输入格式
第一行整数n,整数k,1<=k<=n
第二行n个无序数
输出格式
第k小的数
输入样例 复制
3 2
3 1 2
4 2
4 1 7 5
输出样例 复制
2
4
3、补充归并+快排理论:
算法基础15 —— 分治算法(归并排序 + 快速排序)-优快云博客
注意:快排代码看下面的(不要看上面的快排代码是错误的)
import java.util.Scanner;
public class Main {
static int n;
public static void swap(int a[] ,int t1,int t2){
int tmp = a[t1];
a[t1] = a[t2];
a[t2] = tmp;
}
public static int find_k(int a[],int k,int left,int right){
//先找基准默认为第一个
int patition = a[left];
int i = left,j = right;
while(i<j){
while(i<=j&&a[i]<=patition)i++;
//因为遇到a[i] > p的了
if(i<j)swap(a,i,j);
while(j>=i&&a[j] >= patition)j--;
//遇到a[j]<p的了
if(i<j)swap(a,i,j);
}
swap(a,j,left);
//只要快排左边
if(j>k){
return find_k(a,k,left,j-1);
}
if(j<k){
return find_k(a,k,j+1,right);
}
return j;
}
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
while(s.hasNextInt()){
n = s.nextInt();
int k = s.nextInt();
int[] a = new int[n+1];
for(int i=1;i<=n;i++){
a[i] = s.nextInt();
}
//找第k小的数
int k_index = find_k(a,k,1,n);
System.out.println(a[k_index]);
}
}
}