如何用一次循环找出某个数组中最小的两个数

在构造Huffman树的过程中,需要考虑两个最小权值结点的合并问题,这就需要我们找到结点数组中权值最小的两个结点,具体思路是构造两个变量min1,min2,然后让他们与数组中的其他权值比较,其中min1存放的是当前数组中的最小权值,在比较过程中,当发现有更小的权值时,就把min1的原始值赋予min2,min1继续存放最小值,这样在O(n)的时间复杂度下便可完成寻找。
注意:若min1与min2的初始位置指向数组中的某个值,如 1, 2, 3, 4, 5 且min1 = 1, min2 = 1
因为min1本来就是数组中的最小值,所以不会发生变化,但这会导致min2的值同样永远不改变。解决方法是为min1赋予一个比数组元素都要大的初始值(min2的初始值无关紧要),从而可以完成查找。

#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std; 
int search_tag(int *a, int start, int end, int target)
{
	for(int i = start; i <= end; i++)
		if(a[i] == target)
			return i;
}
int main()
{
	srand(time(NULL));
	int a[10] = {0};
	int min1, min2, s1, s2;
	for(int i = 0; i < 10; i++)
	{
		a[i] = rand() % 100 + 1;
		cout << a[i] << " ";	
	}
	cout << endl;
	min1 = 101;
	min2 = a[0]; 
	for(int i = 0; i < 10; i++)
	{
		if(a[i] < min1)
			{
				min2 = min1;
				min1 = a[i];
				s1 = i;
				s2 = search_tag(a, 0, i - 1, min2);
			}
		else if(a[i] < min2)
			{
				min2 = a[i];
				s2 = i;
			}
	}
	cout << "min1 = " << min1 << " 在第 " << s1 + 1 << " 个位置" << endl;
	cout << "min2 = " << min2 << " 在第 " << s2 + 1 << " 个位置" << endl;
	system("pause");
	return 0;
} 

s1与s2分别记录最小值和次小值的坐标。
这里search_tag函数的作用是:当权值数组出现类似5,4,3,2,1 的特殊情况时,循环中的第二个判断将不会执行,也就意味着s2无法获得数值,故此时应在第一个判断中使用search_tag函数对min2所在的位置进行搜寻,并返回其下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值