怎么查找一个数组里面最小和次小的两个元素 C++

void SelectMin(int&x,int&y,int i) //从1-i中选出权值最小的节点 //这里有问题!
{
for(int j=0;j<i;j++) //寻找第一个比较的点
{
if(HTree[j].parent==-1) //满足则可以比较
{
y=x=j; //初始化x和y;
for(int k=j;k<i-1;k++) //开始比较,执行完之后找到最小的下标。
{
if(HTree[k+1].parent==-1)
{
if(HTree[x].weight>HTree[k+1].weight) //如果x的权重大于j+1的权重,则小的为j+1;
{
y=x;
x=k+1;
} //找到最小值
else
{
if(HTree[y].weight>HTree[k+1].weight)
{
y=k+1; //找到次小值;
}
}
}
}
if(x==y)
{
int i=x;
do{i++;}while(HTree[x].weight==HTree[i].weight);
y=i;
}
break;
}

}
}

方法一:查找一个数组里面最小和次小的两个元素,可采用先按从小到大排序,然后,取出前两位数,得到最小和次小。但这种方法时间复杂度较高。

方法二:

    先假定数组的前两位中的较小的是最小,较大的是次小

    循环检查其余的元素,

      若新元素小于最小,则,最小变为次小,新元素成为最小

      否则,再判断新元素是否小于次小,是,则新元素变为次小

    循环结束,输出两个数。

这种方法,一次遍历数组,就可以得到结果,效率比排序高出很多。

参考代码及运行效果:

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-24
遍历一遍找即可找到最小和次小:
设用m1好m2分别表示最小和次小:
(1)m1=m2=首元素;
(2)遍历各元素:如果 当前元素<m1,则m2=m1, m1=当前元素。追问

如数组是44431222,这个方法是绝对不对的!至少要把>改成>=,且要加上y与后面的数字比较。
我已经自己解决了,百度上有很多的程序解释都是错的…

本回答被提问者采纳