//随机选择算法,从A【left,right】中返回第K大的数
/*int randSelect(int A[],int left,int right,int K){
if(left==right)return A[left];
int p=randPartition(A,left,right);
int M=p-left+1;
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);
}
}*/
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
using namespace std;
const int maxn=100010;
int A[maxn],n;
int randPartition(int A[],int left,int right){
int P=(round(1.0*rand())/RAND_MAX*(right-left)+left);
swap(A[p],A[left]);
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;
}
void randSelect(int A[],int left,int right,int K){
if(left==right) return;
int P=randPartition(A,left,right);
int M=P-left+1;
if(K==M)return;
if(K<M){
randSelect(A,left,P-1,K);
}else{
randSelect(A,P+1,right,K-M);
}
}
int main(){
srand(unsigned time(NULL));
int sum=0,sum1=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
sum+=A[i];
}
randSelect(A,0,n-1,n/2);
for(int i=0;i<n/2;i++){
sum1+=A[i];
}
printf("%d\n",(sum-sum1)-sum1);
return 0;
}
随机选择算法,从A【left,right】中返回第K大的数
最新推荐文章于 2022-02-27 13:37:43 发布
这篇博客介绍了如何使用随机选择算法randSelect来找到数组中第K大的元素。代码实现中,randPartition函数用于将数组划分,并返回基准元素的位置。在main函数中,通过randSelect找出数组前半部分的和,进而计算第K大元素的值。此算法在处理大数据集时具有较高的效率。
摘要由CSDN通过智能技术生成