取出数组中最小的两位元素
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void findTwoMin() {
int roadNumber = 10;
int roadWeight[roadNumber];
srand((unsigned int) time(0));
// 随机生成十个数
for (int i = 0; i < roadNumber; ++i) {
roadWeight[i] = rand();
}
// 将第一个元素与第二个元素设为两位最小的元素
int firstMin = roadWeight[0];
int secondMin = roadWeight[1];
for (int k = 2; k < roadNumber; ++k) {
// 如果第一个较小的元素大于第K个元素,将第K个元素赋值给第一个较小的元素
if (firstMin > roadWeight[k]) {
firstMin = roadWeight[k];
} else if (secondMin > roadWeight[k]) {
secondMin = roadWeight[k];
}
}
for (int j = 0; j < roadNumber; ++j) {
cout << roadWeight[j] << " ";
}
cout << endl;
cout << firstMin << " " << secondMin << endl;
}
这个是第一个版本,有bug,例如:
在后面比较的过程中,当k为2时,第k个元素为19428,与firstMin比较,不小于firstMin,进入下一次循环,问题出现在这个比较上,有可能出现第k个元素的值虽然小于firstMin,但是firstMin的值也小于secondMin的值,例如当k为6时,第k个元素为1823,此时firstMin为2009,secondMin为5345,若将1823赋值给firstMin,则会错过此时较小的2009,导致最终结果出错。
修改如下
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void findTwoMin() {
int roadNumber = 10;
int roadWeight[roadNumber];
srand((unsigned int) time(0));
// 随机生成十个数
for (int i = 0; i < roadNumber; ++i) {
roadWeight[i] = rand();
}
// 将第一个元素与第二个元素设为两位最小的元素
int firstMin = roadWeight[0];
int secondMin = roadWeight[1];
for (int k = 2; k < roadNumber; ++k) {
// 如果较小的元素有任一个大于第k个元素,则将第k个元素赋值给firstMin和secondMin中较大的那个
// 这样在三个元素中:第k个元素,firstMin,secondMin,最后firstMin和secondMin为较小的两个
if (firstMin > roadWeight[k] || secondMin > roadWeight[k]) {
firstMin > secondMin ? firstMin = roadWeight[k] : secondMin = roadWeight[k];
}
}
for (int j = 0; j < roadNumber; ++j) {
cout << roadWeight[j] << " ";
}
cout << endl;
cout << firstMin << " " << secondMin << endl;
}