思路:改进快排算法。假设需要找到第K大元素,则只针对K序号所在的分支进行快速排序。
时间复杂度:接近O(n)
实现:
#include <iostream>
using namespace std;
int partition(int arr[], int left, int right)
{
int pivot = arr[left];
if(left<right)
{
while(left<right)
{
while(left<right&&arr[right]>=pivot)
--right;
arr[left]=arr[right];
while(left<right&&arr[left]<=pivot)
++left;
arr[right]=arr[left];
}
}
arr[right] = pivot;
return right;
}
int findKthMax(int arr[], int left, int right, int k_index)
{
int curr = partition(arr, left, right);
if(curr<k_index-1)
return findKthMax(arr,curr+1,right,k_index);
else if(curr>k_index-1)
return findKthMax(arr,left,curr-1,k_index);
return curr;
}
int main()
{
int arr[] = {3,2,5,1,9,7,6,10};
int size = sizeof(arr)/sizeof(int);
int resultIndex = findKthMax(arr,0,size-1,8);
cout<<"the N-th max element is:"<<arr[resultIndex]<<endl;
return 0;
}