#include <stdio.h>
#include <stdlib.h>
#define SMaxSize 10000
typedef int ElementType;
typedef int Position;
typedef struct Node *PtrToNode;
struct Node{
ElementType Data[SMaxSize];
Position Last;
};
typedef PtrToNode List;
void swap(ElementType *X,ElementType *Y ){
ElementType Tmp;//交换X,Y;需通过交换地址交换值
Tmp=*X;
*X=*Y;
*Y=Tmp;
}
ElementType FindKthLargest(ElementType S[],int K,int Left,int Right){
ElementType e=S[Left];//将最左端数最为基准数
int L=Left;//L、R一直未更新,标记初始数组的最左端和最右端
int R=Right;
//将大于e的数移到左边,小的数移到右边
while(1){
while(Left<=Right&&e<=S[Left])
Left++;
while(Left<Right&&e>S[Right])
Right--;
if(Left<Right)
swap(&S[Left],&S[Right]);
else break;
}
//将基准换到两个集合之间左为S1,右为S2
swap(&S[Left-1],&S[L]);
//Left-1-L为大于等于基准数的集合S1里元素的总个数,即这段区间的长度
if(Left-1-L>=K)//说明第K大的数在左集合S1里
return FindKthLargest(S,K,L,Left-2);//在集合S1中继续查找
else if(Left-1-L<K-1)//说明第K大的数在右集合S2里
return FindKthLargest(S,K-(Left-1-L)-1,Left,R);//在集合S2中继续查找
else return e;//说明e就是我们要找的第K大的数
}
List ReadInput()
{
int n;
List L;
scanf("%d",&n);
L=(List)malloc(sizeof(struct Node));
for (int i=0;i<n;i++){
scanf("%d",&L->Data[i]);
}
L->Last=n-1;
return L;
}
int main(){
int K;
List L;
L=ReadInput();
printf("input you want to find Kth largest number\n");
scanf("%d",&K);
printf("%d",FindKthLargest(L->Data,K,0,L->Last));
}
寻找第K大的数
最新推荐文章于 2022-01-02 20:06:31 发布