作业比赛编号 : 100000587 - 《算法笔记》4.7小节——算法初步->其他高效技巧与算法 问题 A: 求第k大数
答案输出错误解惑:
1. 令人不解处:
关于第k大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。
2. 输出时为:注意参数
由此推知题目中所说的第k大为从最大的数开始数,然后依次递减得到第k大的数,例如{1 2 3 4 5 6}中的第1大的数为6,第2大的数为5,第3大的数为4…
printf("%d\n",randSelect(a,0,n-1,n-m+1)) ;
---------------------------------------------------如果感觉不错,欢迎点赞收藏---------------------------------------------
代码
#include<stdio.h>
int partition(int a[],int left,int right)
{
int temp=a[left];
while(left<right)
{
while(left<right&&a[right]>temp)
right--;
a[left]=a[right];
while(left<right&&a[left]<temp)
left++;
a[right]=a[left];
}
a[left]=temp;
return left; //返回的是相遇的节点,同时也可以知道a[left]在数组中为第left大的数,从0开始算
}
int randSelect(int a[],int left,int right,int K)
{
if(left==right) return a[left];
int p=partition(a,left,right);
int M=p-left+1;//a[p]是a[left...right]中的第M大
if(K==M) return a[p];
if(K<M)
return randSelect(a,left,p-1,K);
else return randSelect(a,p+1,right,K-M);
}
int main()
{
int n;
int m;
while(scanf("%d %d",&n,&m)!=EOF)
{
int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
printf("%d\n",randSelect(a,0,n-1,n-m+1)) ;
}
return 0;
}
/**************************************************************
Problem: 5067
User: ********
Language: C++
Result: 正确
Time:3 ms
Memory:1192 kb
****************************************************************/