描述

给定一个数组,统计前k大的数并且把这k个数从大到小输出。

输入第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。输出从大到小输出前k大的数,每个数一行。样例输入

10
4 5 6 9 8 7 1 2 3 0
5

样例输出

9
8
7
6
5 排序后再输出,复杂度 O(nlogn)
用分治处理: 复杂度 O(n+mlogm)
思路:把前m大的都弄到数组最右边,然后对这最右边m个元素排序,
再输出
关键 : 利用快排思想在O(n)时间内实现把前m大的都弄到数组最右边
 #include<iostream>
using namespace std;
int n;
int a[];
int k;
int partition(int s, int e)
{
int key = a[s];
int i = s;
int j = e;
while (i < j)
{
while (a[j] >= key & i < j)
{
j--;
}
while (a[i] <= key & i < j)
{
i++;
}
swap(a[i], a[j]);
}
if (a[i] < key)
{
swap(a[s], a[i]);
}
else
swap(a[s], a[i - ]);
return i;
}
void quickSort(int s,int e)
{
if (s < e)
{
int m = partition(s, e);
quickSort(s, m - );
quickSort(m+, e);
}
}
void arrangeRight(int s,int e,int k)
{
if (e - s + == k)//如果要找到大数个数就是数组长度,不进行操作,直接排序
{
return;
}
//找一个基准数,使比这个数大的都在右边,小的都在左边
int key = a[s];
int i = s;
int j = e;
while (i < j)
{
while ((a[j] >= key) && (i < j))
{
j--;
}
while ((a[i] <= key) &&( i < j))
{
i++;
}
swap(a[i], a[j]);
}
if (a[i] < key)
{
swap(a[s], a[i]);
}
else
{
swap(a[s],a[i-]);
}
int index = i;//最后基准数的位置
int len = e - index + ;
if (len == k)
{
return;
}
else if (len > k)//找到的大数多余规定的,再往右缩小范围
{
arrangeRight(index+,e,k);
}
else//找到的大数不够k个,往左扩大寻找范围,已找到len个,还差len-m个
{
arrangeRight(s,index-,k-len);
}
}
int main()
{
cin >> n;
for (int i = ; i < n; ++i)
{
cin >> a[i];
}
cin >> k;
arrangeRight(, n - ,k);
quickSort(n-k,n-);
for (int i = n-; i >= n - k; --i)
{
cout << a[i] << endl;
}
system("pause");
return ;
}
 

【分治】输出前k大的数的更多相关文章

  1. OpenJ_Bailian 7617 输出前k大的数

    题目传送门 OpenJ_Bailian 7617 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个 ...

  2. 7617:输出前k大的数

    7617:输出前k大的数 查看 提交 统计 提问 总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小 ...

  3. 输出前 k 大的数

    总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小 ...

  4. 输出前k大的数

    总时间限制: 10000ms单个测试点时间限制:1000ms内存限制:65536kB(noi) 描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大 ...

  5. noi 统计前k大的数

    描述 给定一个数组,统计前k大的数并且把这k个数从大到小输出. 输入 第一行包含一个整数n,表示数组的大小.n < 100000. 第二行包含n个整数,表示数组的元素,整数之间以一个空格分开.每 ...

  6. 输出前n大的数(分治)

    描述:给定一个数组包含n个元素,统计前m大的数并且把这m个数从大到小输 出. 输入: 第一行包含一个整数n,表示数组的大小.n < 100000.第二行包含n个整数,表示数组的元素,整数之间以一 ...

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

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

  8. 第k大的数,前k大的数

    1.排序后去出前k个,o(n*log(n))    如果k<log(n),可以考虑直接选择排序,因为只需要执行找到第k个就可以结束 o(n*k) 2.o(nlog(k))快排把数分为了两个部分, ...

  9. pandas取前K大的数,sort_values()和nlargest()速度比较

    排序量比较大时: 数据量比较小时: 所以结论就是: 数据量大时选用nlargest,数据量小时选用sort_values() 具体数据量怎么算大:10000条时两个方法的时间差不多,所以可以按1000 ...

随机推荐

  1. [转]Keyword Reference (F#)

    Visual F# Development Portal http://msdn.microsoft.com/en-us/library/vstudio/ff730280.aspx 本文转自:http ...

  2. 静态代理,jdbc动态代理和cglib动态代理

    静态代理 1.定义抽象主题接口. package com.zhangguo.Spring041.aop02; /** * 接口 * 抽象主题 */ public interface IMath { / ...

  3. bootstrap不同屏幕区分数值

    @media (min-width:1200px){ } @media (min-width:992px) and (max-width:1199px){ } @media (min-width:76 ...

  4. markdown表格中怎么插入逻辑或符号|?

    | 73向下投票接受 | 如果你删除反引号(****),使用|`黑客作品 a | r ------------|----- `a += x;` | r1 a |= y; | r2 并产生以下输出 在这 ...

  5. 什么是混合app开发

    webApp 移动app 就是在浏览器中运行的web应用 (网页应用)开发成本低 体验差 不需要安装 NativeApp :用Android和object-C原生语言开发的应用 开发成本高 需要安装( ...

  6. idea 常用操作

    1.创建的maven项目,java文件不提示错误:有main方法但右击却找不到run选项的问题 1)首先要配置SDK--就是配置JDK 2)然后要按照提示信息导入某些maven相关的东西,就这个Eve ...

  7. js 删除数组中某一项的几种方法总结

    第一种:改变原数组 借用原生数组方法:splice(index,len,[item])  剪接 借用原生对象方法:delete array[index] + array.slice(0, index) ...

  8. CAD参数绘制批注(com接口)

    C#中实现代码说明: private void DrawComment() { MxDrawComment com = new MxDrawComment(); MxDrawPoint pt = ne ...

  9. vue全选和取消全选

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  10. 08JavaScript数学与日期时间对象

    JavaScript数学与日期时间对象 5.1.3数学(Math)对象 <script> //欧拉常量,自然对数的底(约等于2.718); document.write(Math.E+&q ...