利用快速排序来查找无序数组中第K大的数,通过判断下标,只计算有k的那一半,时间复杂度为 O(n).
#include<iostream>
using namespace std;
const int maxn=256;
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;
}
int quickSort(int A[],int left,int right,int k)
{
if(left<right)
{
int pos=Partition(A,left,right);
if(pos>k)
quickSort(A,left,pos-1,k);
else if(pos<k)
quickSort(A,pos+1,right,k);
else
return pos;
}
}
int main()
{
int A[maxn],k,n;
cout<<"您要输入几个数字";
cin>>n;
cout<<"请输入";
for(int i=0;i<n;i++)
{
cin>>A[i];
}
cout<<"请输入需要查找第几大的数";
cin>>k;
int num=quickSort(A,0,n-1,k-1);
cout<<"第"<<k<<"大的数为:"<<A[num];
}