用分治法从n个数中查找第k个小元素 。
输入
第一行,一个整数,表示元素的个数n;第二行,n个整数,表示n个元素;第三行,一个整数,表示k的值 。
输出
n个数中第k小元素
样例输入 Copy
6 5 2 9 12 8 10 3
样例输出 Copy
8
代码:
#include<stdio.h>
#include<stdlib.h>
int l[100];
int partition(int l[],int left,int right){
int i=left;
int j=right+1;
do{
do i++;while(l[i]<l[left]);
do j--;while(l[j]>l[left]);
if(i<j){
int temp;
temp=l[i];
l[i]=l[j];
l[j]=temp;
}}while(i<j);
int temp1;
temp1=l[left];
l[left]=l[j];
l[j]=temp1;
return j;
}
void select(int l[],int n,int k){
int left=0;int right=n;
l[n]=100000;
do{
int j=rand()%(right-left+1)+left;
int temp1;
temp1=l[left];
l[left]=l[j];
l[j]=temp1;
j=partition(l,left,right);
if(k==j+1){
printf("%d",l[j]);break;
}
else if(k<j+1)right=j;
else left=j+1;
}while(1);
}
int main(){
int n;int k;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&l[i]);
}
scanf("%d",&k);
select(l,n,k);
}