#包含
#包含
#包含
#包含
using namespace std;
//求出最初元素、中间元素、最后元素的中值,调换中值和最初元素的位置
inlinevoidmedianaspivot (intarr [ ],const int left,const int right ) )。
{
constintmiddle=left(right-left ) 1;
const int l=arr[left];
const int m=arr[middle];
const int r=arr[right];
if(L=mm=R||R=mm=L ) swap(arr[left],arr[middle] );
if(l=RR=m||m=RR=l ) swap(arr[left],arr[right] );
}
//求出左侧所有要素小于该要素,右侧所有要素不小于该要素的分割位置I
//另外,求出的该位置的元素值是第i 1大的元素
intpartition(intarr[],const int left,const int right ) )。
{
这是左写(if )
{
medianaspivot(arr,left,right );
int i=left;
int j=right;
int key=arr[i]; //以最初的元素为pivot
wile(Ij ) )。
{
wile(I=key ) j----;
if(Ij ) arr[i ]=arr[j];
wile(I
if(Ij ) arr[j--]=arr[i];
}
arr[i]=key;
return i;
}
返回左;
}
//在快速排序中查找第k大元素
intfindKTH(intarr[],int n,int k ) )。
{
int position=-1;
int i=0;
int j=n-1;
为wile (真)
{
position=partition(ARR,I,j );
定位n-k )。
{
I=位置1;
j=n-1;
}
else if (位置n-k ) ) )。
{
i=0;
j=位置- 1;
}
else return arr[position];
}
}
int main () )
{
intarr [ ]={ 7,8,9,1,2,3,6,5,4 };
intsize=sizeof(arr )/sizeof (int );
int k=8;
intknum=findKTH(ARR,size,k );
复印(arr,arr size,ostream_iterator ) ) cout,' ');
打印((n );
printf(the%DTHnumberis%d.n )、k和kNum );
返回0;
}