#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; }