社区
数据结构与算法
帖子详情
N个元素中找到两个最小元素的方法
darkstar21cn
2002-09-02 09:37:44
N个元素中找到两个最小元素的方法以及他的比较次数。
...全文
535
16
打赏
收藏
N个元素中找到两个最小元素的方法
N个元素中找到两个最小元素的方法以及他的比较次数。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
16 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
darkstar21cn
2002-09-15
打赏
举报
回复
谢谢saint001(saint001) 的理论知识,但大家应该都知道的.
darkstar21cn
2002-09-15
打赏
举报
回复
to zhangyilan(数字通信):数组是无序的.
dcyu
2002-09-07
打赏
举报
回复
#include <stdio.h>
#include <stdlib.h>
#define INT_MAX 32767
int main()
{
int min,secmin;
int i,x,n;
max=INT_MAX;
secmax=INT_MAX;
printf("Total Num: ");
scanf("%d",&n);
if(n<1) return 1;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x<=min) {
secmin=min;
min=x; }
else {
if(x<=secmin) secmin=x;
else continue; }
}
printf("Min is %d. Secmin is %d. ",min,secmin);
return 0;
}
这是我过去发的贴子中改的,参考:
http://www.csdn.net/expert/topic/938/938945.xml?temp=.9978296
saint001
2002-09-06
打赏
举报
回复
败者树是外排算法
在许多实际应用系统中,经常遇到要对数据文件中的记录进行排序处理。由于文件中的记录很多、信息量庞大,整个文件所占据的存储单元远远超过一台计算机的内存容量。因此,无法把整个文件输入内存中进行排序。于是,就有必要研究适合于处理大型数据文件的排序技术。通常,这种排序往往需要借助于具有更大容量的外存设备才能完成。相对于仅用内存进行排序(又称为内排序)而言,这种排序方法就叫做外排序。在实际应用中,由于使用的外存设备不同,通常又可以分为磁盘文件排序和磁带文件排序两大类。磁带排序和磁盘排序的基本步骤相类似,它们的主要不同之处在于初始归并段在外存贮介质中的分布方式,磁盘是直接存取设备,磁带是顺序取设备。
外部排序基本上由两个相对独立的阶段组成。首先,按可用内存大小,将外存上含n个记录的文件分成若干长度为h的子文件,依次读入内存并利用有效的内部排序方法对它们进行排序,并将排序后得到的有序子文件重新写入外存,通常称这些有序子文件为归并段或顺串;然后,对这些归并段进行逐趟归并,使归并段(有序的子文件)逐渐由小到大,直至得到整个有序文件为止。
最简单的归并方法类似于内部排序中的二路归并算法。二路归并排序的方法,其基本思想就是:先把具有n个记录的文件看作是由n个长度为1的顺串构成的。在此基础上进行一趟又一趟的归并。一趟归并,是把文件中每一对长度为 h的顺串合并成一个长度为2h的顺串;其结果将使文件中顺串的长度增加一倍而使顺串的数量减少一半。经过若干趟归并之后,当文件中只含有一个长度为n的顺串时,整个文件的排序就完成了。
还有一种常用的快速的多路归并法:多路归并排序。多路归并排序是二路归并排序的推广,它可以减少归并趟数,m 路归并排序的基本方法是:开始,把若干长度为K的初始顺串尽量均匀地分布到m个输入文件f1...,fm上。然后反复从f1,...,fm各读一个顺串,归并成长度为mk的顺串,轮流地写到输出文件g1,...,gm上。下一趟从g1,...,gm归并到f1,...,fm.一趟又趟地反复进行,直到排序结束。在进行多路归并时,需要从K个记录中选关键字最小的记录,为了不增加内部归并时需进行关键字比较的次数,在具体实现时,通常不用选择排序的方法,而用"败者树"来实现。又从外部的趟数[logkm]可见,若减少m也可减少外排的时间,对待排序的初始记录进行"置换选择排序"可以得到平均长度为2h的有序子序列。这些内容在此不予讨论,有兴趣者可参阅有关参考书。
Banned
2002-09-06
打赏
举报
回复
趋同gofor
树形选择排序
找出最小数实际上是初始化完全二叉树,
经过[N/2]次比较就能得到最小数;
然后把最小数改变成最大的数(就是比其他的数都大),
沿着叶子结点到根的路径上调整二叉树,得到一个最小数,
这个最小数是原来的次小数了,花时[logN],
于是[N/2]+[logN]<N
qiuyang_wang
2002-09-06
打赏
举报
回复
zhangyilan(数字通信) :你说的折半比较在特殊情况下可能会出现错误结果的。
o3y
2002-09-06
打赏
举报
回复
我觉得我们不如思考一个求第k小元素的算法,第二小元素的算法不太难,qiuyang_wang(小数点)的就可以了
zhangyilan
2002-09-06
打赏
举报
回复
折半比较吧
将数据的前1/2与后1/2的数据相应比较1/2次
较下的数放在前1/2
然后再折半比较1/4
。。。。。
royalier
2002-09-06
打赏
举报
回复
设
min,min2 为用来保存的N个数中的最小的两个。min是最小,min2为次小。
第一次读入前2个数,比较大的放在min2,小的放在min。
从3个数开始。与min2比较。大于的情况下,继续比较下一个。
小于的情况下,置换掉min2。然后min和min2比较。
Banned
2002-09-05
打赏
举报
回复
用最小堆来实现吧
如果用插入操作来构建初始化堆,可以在O(nlogn)的时间内完成
堆的初始化,即比较次数不超过nlogn;
堆初始化后最顶的元素就是最小的元素,
然后删掉最小元素后形成的新堆的最小元素就是原来的堆的
次小元素,删除的操作可以在O(logn)内完成。
于是求两个最小元素 的时间复杂度为
O(nlogn+logn)。
darkstar21cn
2002-09-05
打赏
举报
回复
up!
怎么没人理我了?
qiuyang_wang
2002-09-03
打赏
举报
回复
设定两个存储单元:N1,N2,N1中保存最小的两个中较大的一个,N2中保存最小的一个。
假设前两个数是最小的,比较这两个数,将小的放在N2中,大的放在N1中。
从第三个开始循环与N1比较,如果当前比较的值大于N1的值,则继续循环直到最后。如果当前比较的值小于N1的值,则与N2做比较,如果大于N2则用当前值替换N1的值,如果小于N2,则用N2的值替换N1的值,当前值替换N2的值。
这样做法应该是比较最少的了,最少比较:N-1次,最多比较:2N-3次。
darkstar21cn
2002-09-03
打赏
举报
回复
我想到一种方法:使用败者树,比较次数是——n/2+n/4……+2+1=?(好像是等于n吧?)
败者树就是两个数据比较时较大的元素作为他们的根节点,而较小的元素进行下一轮比较。
但不知是否对。清指点,谢谢!
KingPower410
2002-09-03
打赏
举报
回复
建立一棵二插树。取一个元素做根(root),也是比较的基点。然后取下一个元素与root比较,如果小于root的话,该元素做左子树的root,否则做右子树的root。依此递归下去,得到一个二叉树。用中序遍历得到的第一、第二的元素即是两个最小的元素了。
gofor
2002-09-02
打赏
举报
回复
树形选择排序。
找出最小数,N-1次比较
找出第二个最小数,logN次
Lawrence444
2002-09-02
打赏
举报
回复
直接找,2n-2次。
两个数排一下序,最坏2n-1次,平均时候要小的多。
找到
n
个
元素
中
的第二小
元素
算法导论
中
的一道习题: 证明: 在最坏情况下,
找到
n
个
元素
中
的第二小的
元素
需要n+ceil(lgn)-2次比较。(提示:可以同时
找到
最小
元素
,ceil表示向上取整) 思路:
找到
最小
元素
需要n-1次比较。采用两两结合比较的
方法
。如果n为奇数,则取第一
个
元素
为临时
最小
元素
min,其它两两结合比较,形成一个类似树的比较过程。如果n为偶数,则直接进行两两结合比较,根节点即为
最小
元素
。 接下来查找
一日一技:python
中
找出列表内最大或
最小
的N
个
元素
问题 在工作
中
,我们经常需要对列表字典集合等结构
中
的数据进行排序,取出最大或
最小
的N个值 解决方案: 这时就可以使用python
中
的heapq模块来快速实现我们的需求,在heapq模块
中
,有
两个
专门用来取最大和
最小
的N
个
元素
的
方法
,分别是heapq.nlargest()和heapq.nsmallest() 语法: nlargest(n, iterable, key=None) nsmallest(n, iterable, key=None) 这
两个
方法
都有三个参数: 参数 n :代表取前N
数组
中
两
个
元素
的
最小
距离
问题:给定一个数组,数组
中
含有重复
元素
,给出
两个
数n1和n2,求这
两个
数在数组
中
所出现位置的
最小
距离。例如,数组{4,5,6,4,7,4,6,4,7,8,5,6,4,3,10,8},4和8的
最小
距离是2. 思路:遍历数组,会遇到
两个
情况,一,当遇到n1时候,记录下n1对应的数组下标的位置n1_index,通过求n1_index与上次遍历到n2的下标值n2_index的差,可以求出最近一次遍历到n
如何求数组
中
两
个
元素
的
最小
距离(两种
方法
)
给定一个数组,数组
中
含有重复的
元素
,给定
两个
数字num1,num2,求这
两个
数字在数组
中
出现的位置的
最小
距离。 分析: 对数组双重遍历,找出
最小
距离,但是这种
方法
效率比较低。由于在求距离时只关心num1,num2这
两个
数,因此只需要对数组进行一次遍历即可,在遍历的过程
中
分别记录num1,num2的位置就可以非常的方便的求出
最小
的距离,下面分别详细介绍两种思想
方法
:
方法
一:蛮力法 对数组进行双重遍历,外层循环遍历查找num1,只要遍历到num1,内层循环对数组从头开始遍历找出num2,每当遍历到
(冒泡排序)找出数组
中
相差
最小
的两
个
元素
问题情境: 设计算法找出数组a[n]
中
相差
最小
的两
个
元素
,考虑数组
中
的
元素
互不相同和有相同
元素
两种情况。 起泡排序/冒泡排序: 基本思想: 两两比较相邻记录,如果反序则交换,直到没有反序的记录为止。 排序过程: (以升序排列为例) (1)将整个待排序的记录序列划分为有序区和无序区,初始时有序区为空,无序区包括所有待排序的记录。 (2)对无序区从前向后依次比较相邻记录,若反序则交换,
数据结构与算法
33,006
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章