求第k大數

\quad求一個序列裏面第k大的數,用partition可以再O(n)O(n)時間複雜度內求解

/*
    對數A[left,right]進行一次partition操作後,主元pivot左側元素都小於它,右側都大於它。設
pivot索引爲p,則pivot是第p-left+1大元素。求第k大時,若k==p-left+1,則說明第k大數就是pivot,
若k<p-left+1,則說明第k大數在pivot左側,在A[left,p-1]中繼續遞歸查找,否在在pivot右側,在
A[p+1,right]中遞歸查找。
*/
#include <bits/stdc++.h>
using namespace std;

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 KstMax(int A[], int left, int right, int k)
{
	if(left==right) return A[left];
	int p = partition(A, left, right);
	if(k==p-left+1) return A[p];
	if(k<p-left+1) return KstMax(A, left, p-1, k);
	else return KstMax(A, p+1, right, k);
}

int main(int argc, char const *argv[])
{
	int n=10;
	int A[10] = {9, 8, 4, 5, 2, 3, 5, 6, 12, 1};
	cout << KstMax(A, 0, n-1, 7) << endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章