/* 用快速排序实现求第k大数*/
#include <iostream>
#include<stdio.h>
using namespace std;
int arr[100];
int Partition(int left,int right){
int random=rand()%(right-left)+left;
swap(arr[left],arr[random]);
while(left<right){
while(left<right&&arr[left]<arr[right]){
right--;
}
swap(arr[left],arr[right]);
while(left<right&&arr[left]<arr[right]){
left++;
}
swap(arr[left],arr[right]);
}
return left;//这里left和right是一样,返回哪个都OK。
}
/*
void Quicksort(int left,int right){//实现正常快速排序的Quicksort函数
if(left<right){
int position=Partition(left,right);//选一个pivot下标
Quicksort(left,position-1);
Quicksort(position+1,right);
}
}
*/
//下面是实现查找第 K 大数的Quicksort函数
int Quicksort(int left,int right,int k){
int position=Partition(left,right);
if(position==k-1){
return arr[position];
}
else if(position<k-1){
return Quicksort(position+1,right,k);
}
else{
return Quicksort(left,position-1,k);
}
}
int main()
{int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int k;
scanf("%d",&k);
printf("%d\n",Quicksort(0,n-1,k));
//测试代码
/*
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
*/
return 0;
}
小结:用快排实现求第k大数可以实现O(n)的时间复杂度。
1096

被折叠的 条评论
为什么被折叠?



