在构造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所在的位置进行搜寻,并返回其下标。