void SelectMin(HuffmanTree p_HT, int* s11, int* s22, int end)
{
int s1 = 1;
int s2 = 1;
for (int i = 1; i <= end; i++)
{
if ((p_HT + i)->parent != 0)
{
continue;
}
else if ((p_HT + i)->weight < (p_HT + s1)->weight)
{
s2 = s1;
s1 = i;
}
else if (((p_HT + i)->weight >= (p_HT + s1)->weight) && ((p_HT + i)->weight <= (p_HT + s2)->weight))
{
s2 = i;
}
else { continue; }
}
*s11 = s1;
*s22 = s2;
}
原本逻辑链:
step1:用数组里面的第二个元素位置作为s1,s2的值
step2:如果P_HT第i+1个元素的parent不等于0,跳过该循环。
step3:小于s1的weight,s2 = s1,s1 = i。
step4:大于等于s1weight,小于等于s2的weight,则s2 = i。
step5:一直循环。
问题:
可能并没有在不放回的情况下,一定找到数组里面的两个最小元素。
原因:第二个元素是最小的,那么返回的两个元素本质是同一个元素(刚开始遇到会导致同一个元素,后面遇到这种情况会导致没有找到)。
问题关键词:
数组不放回元素,仍然顺序全部遍历,有可能不满足if条件导致找不到两个元素(找不到,两个元素).
解决方案:
void SelectMin(HuffmanTree p_HT, int* s11, int* s22, int end)
{
int m1, m2, index1, index2;
HuffmanTree p = p_HT;
m1 = 10000; m2 = 10000;
index1 = 0; index2 = 0;
for (int i = 1; i <= end; i++)
{
if ((p + i)->parent != 0) { continue; }
else if ((p + i)->weight < m1)
{
m2 = m1;//假设m1小于m2
m1 = (p + i)->weight;
index2 = index1;
index1 = i;
}
else if ((p + i)->weight <= m2)
{
m2 = (p + i)->weight;
index2 = i;
}
}
*s11 = index1;
*s22 = index2;
}