社区
C++ 语言
帖子详情
从100万个整数里找出100个最大的数
lizhaochai
2008-07-25 03:44:14
从100万个整数里找出100个最大的数(用哪种算法效率高)
...全文
7773
59
打赏
收藏
从100万个整数里找出100个最大的数
从100万个整数里找出100个最大的数(用哪种算法效率高)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
59 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
itkingdom
2011-10-15
打赏
举报
回复
都是高人啊,学习了,呵呵
贾囧雷
2011-09-26
打赏
举报
回复
很容易,胜者树
jjqldyt
2011-04-27
打赏
举报
回复
8楼的这个算法比27楼的一点都不差啊,我个人感觉,有人给分析下么
template< class T >
void solution_3( T BigArr[], T ResArr[] )
{
//取最前面的一万个
memcpy( ResArr, BigArr, sizeof(T) * RES_ARR_SIZE );
//标记是否发生过交换
bool bExchanged = true;
//遍历后续的元素
for( int i = RES_ARR_SIZE; i < BIG_ARR_SIZE; ++i )
{
int idx;
//如果上一轮发生过交换
if( bExchanged )
{
//找出ResArr中最小的元素
int j;
for( idx = 0, j = 1; j < RES_ARR_SIZE; ++j )
{
if( ResArr[idx] > ResArr[j] )
idx = j;
}
}
//这个后续元素比ResArr中最小的元素大,则替换。
if( BigArr[i] > ResArr[idx] )
{
bExchanged = true;
ResArr[idx] = BigArr[i];
}
else
bExchanged = false;
}
}
上面的代码使用了一个布尔变量bExchanged标记是否发生过交换,这是一个前文没有谈到的优化手段——用以标记元素交换的状态,可以大大减少查找ResArr中最小元素的次数。也对solution_3进行测试一下,结果用时2.0秒左右(不使用bExchanged则高达32分钟),远小于solution_2的用时
minounou
2010-10-17
打赏
举报
回复
【编程之美】里面有这道题的5种解法
yuzsrzz
2010-01-17
打赏
举报
回复
顶
。。。。。。。。。。。
caohoujie
2008-08-05
打赏
举报
回复
建10000个元素的堆才是正解,其他回答都是垃圾
hemdacker
2008-07-27
打赏
举报
回复
mark
tangshuiling
2008-07-27
打赏
举报
回复
mark!
zxcv8356631
2008-07-27
打赏
举报
回复
把值处理后为key(保证大的书key大) 让后建哈希表? 行不?
guolihui112
2008-07-27
打赏
举报
回复
恩 27楼的答案 不错 不过小弟有一下疑问:
“则插入链表中,同时挤掉最小的数”, 这其中最小的数如何判断。尽管“开始分配101个节点,用一个指针记录那个空节点”,但是这个空结点是什么内容?上次新插入的值,还是插入后数组中最小的值?
我的想法:获得最小的数有以下方案
1.插入一个数后,重新排序。这样每次插入一个数都要排序,看似效率不高
2.插入一个数后,将数组中数与新插入的数比较,更新最小值。不过每次插入都要比较,
3.每100个数作为一组,设置两个指针,一个指向旧的100那组最小值(排过序了,所以没什么消耗),一个指向新增加的数中最小值,在每次插入一个新数时候更新两个指针,这样这100个数中最小值即为两个指针指向数的最小值。在每插入100个数后重新排序,作为一个新组重新开始。这种方式看起来比上面两个虽然耗了点空间,不过应该提升了点时间效率。
不知道还有没有别的方案?
devoc
2008-07-27
打赏
举报
回复
[Quote=引用 27 楼 A_B_C_ABC 的回复:]
取前100个数排序,放入链表中.依次取后面的数与100个数的最小数比较,若取到的数比最小数大,则插入链表中,同时挤掉最小的数.这个过程中使用的链表,因为大小是固定的,所以只需要一开始分配101个节点,用一个指针记录那个空节点,则在整个插入删除过程序中,可以不涉及到内存分配.
[/Quote]
这个感觉不错
iambic
2008-07-27
打赏
举报
回复
google你的标题。
f22fbi
2008-07-27
打赏
举报
回复
27L和我的想法一样
光跃
2008-07-26
打赏
举报
回复
实践出真知
herman~~
2008-07-26
打赏
举报
回复
27楼的做法确实比飞雪前面提的数组要节省空间
flashtong
2008-07-26
打赏
举报
回复
[Quote=引用 12 楼 wyx8421 的回复:]
用堆排序只取前100个可以么?时间复杂度好像是O(m(logn))
[/Quote]
想一块去了,
不过看了27楼的,我认为他的方法更好,时间复杂度为 100n ,这种方法适用于 100<<n 的情况下。
lin_style
2008-07-26
打赏
举报
回复
8楼的经典。
赵Andy
2008-07-26
打赏
举报
回复
[Quote=引用 38 楼 yydrewdrew 的回复:]
马克
[/Quote]
yydrewdrew
2008-07-26
打赏
举报
回复
马克
yangkunjie
2008-07-26
打赏
举报
回复
mark
加载更多回复(39)
java面试题
堆和堆栈的区别、常用排序算法分析与实现(Java版) 从
100
万个
整
数
里
找出
100
个
最大
的
数
(用哪种算法效率高)
Go语言官方文档学习笔记(第六季-一撮金游戏)
Go富有表现力,简洁,整洁且高效。它的并发机制使编写程序可以轻松地从多核和联网机器中获得
最大
收益,而其新颖的类型系统则可以实现灵活的模块化程序构造。Go可以快速编译为机器代码,但具有垃圾回收的便利性和运行时反射的功能。它是一种快速的,静态类型的编译语言,感觉就像是一种动态类型的解释语言。Go语言官方文档学习笔记是基于官方文档及个人学习Go的笔记,整理完成的Go语言快速入门课程。第六季内容通过一个完整的一撮金占卜小游戏,实现对基础知识的练习。包括以下十个部分:1-一撮金游戏介绍2-游戏需求分析3-获取内卦的
数
(用户输入的第一个正
整
数
)4-获取外卦的
数
5-内卦的
数
与内卦对应6-外卦的
数
与外卦对应7-爻的算法8-查询卦辞的条件获取9-查询特定卦10-查询其他卦
从
100
万个
数
里
面
找出
10个
最大
的
数
。写出代码并分析复杂度。
题目:从
100
万个
数
里
面
找出
10个
最大
的
数
。写出代码并分析复杂度。 分析: 拿出这组
数
据的前10个
数
构建一个小根堆(堆排序:升序排序10个
数
,先建一个大根堆,再将堆顶的
最大
值与最后一个值交换,这样不断循环直到...
如何从
100
万个
数
中
找出
最大
的前
100
个
数
(2) 对(b,d]重复(1)操作,直到最右边的区间个
数
小于
100
个。注意[a,b)区间不用划分 (3) 返回上一个区间,并返回此区间的
数
字
数
目。接着方法仍然是对上一区间的左边进行划分,分为[a2,b2)b2(b2,d2]两个区间,取
C++ 语言
64,646
社区成员
250,476
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章