首页 > 编程知识 正文

n个数中找出前k大个数,快速排序算法举例说明

时间:2023-05-06 00:11:10 阅读:152464 作者:3623

#包含

#包含

#包含

#包含

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;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。