(分治)输出前m大的数。。。

Posted lijiahui-123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(分治)输出前m大的数。。。相关的知识,希望对你有一定的参考价值。

描述
给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输
出。
输入
第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开
。每个整数的绝对值不超过100000000。
第三行包含一个整数m。m < n。
输出
从大到小输出前m大的数,每个数一行。

思路:

排序后输出(nlogn)

用分治处理(n+mlogm)

关键:n时间内将前m大的都移到最右边

 

引入操作
arrangeRight(k) :把数组(或数组的一部分)前k大的
都弄到最右边
如何将前k大的都弄到最右边
1)  设key=a[0], 将key挪到适当位置,使得比key小的元素都在
key左边,比key大 的元素都在key右边(线性时间完成)
2)  选择 数组的前部或后部再进行arrangeRight操作

 

当a=k时, done
   a> k    对右边a-1个元素再进行arrangeRight (k)
   a< k    对左边b个元素再进行arrangeRight(k-a)

 

以上是关于(分治)输出前m大的数。。。的主要内容,如果未能解决你的问题,请参考以下文章

求第K大数(分治)

求数组中第k大的数(分治法)

[CDQ分治][树状数组][树套树] Jzoj P3197 K大数查询

P3157 [CQOI2011]动态逆序对(CDQ分治)

分治——hyl天梦

分治——hyl天梦