#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,例如:ios
输入:2009 18986 19428 5345 5849 25559 1823 13740 31562 10067
输出:1823 5345数组
在后面比较的过程当中,当k为2时,第k个元素为19428,与firstMin比较,不小于firstMin,进入下一次循环,问题出如今这个比较上,有可能出现第k个元素的值虽然小于firstMin,可是firstMin的值也小于secondMin的值,例如当k为6时,第k个元素为1823,此时firstMin为2009,secondMin为5345,若将1823赋值给firstMin,则会错过此时较小的2009,致使最终结果出错。spa
修改以下code
#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; }