[英]C++ Bubble Sort Algorithm
我在 c++ 中編寫了以下代碼,並且該算法在這種情況下有效。 我知道 c++ 並且不明白我在第二次測試中做錯了什么。
#include <iostream>
using namespace std;
void bubbleSort(int numbers[], int size) {
for (int i = 0; i<size;i++) {
for (int j=0; j<size;j++) {
if (numbers[j] > numbers[j+1]) {
swap(numbers[j], numbers[j+1]);
}
}
}
}
int main() {
int numbers[] = {7,5,6,4};
bubbleSort(numbers,4);
for (int print = 0; print < 4; print++) {
cout << numbers[print] << endl;
}
return 0;
}
但是,當我嘗試輸入已經排序的數字時失敗了:
#include <iostream>
using namespace std;
void bubbleSort(int numbers[], int size) {
for (int i = 0; i<size;i++) {
for (int j=0; j<size;j++) {
if (numbers[j] > numbers[j+1]) {
swap(numbers[j], numbers[j+1]);
}
}
}
}
int main() {
int numbers[] = {1,2,3};
bubbleSort(numbers,3);
for (int print = 0; print < 3; print++) {
cout << numbers[print] << endl;
}
return 0;
}
for (int j=0; j<size;j++) {
例如,如果size
為 3,如果數組具有三個值,則此循環將迭代j
的值 0、1 和 2。
if (numbers[j] > numbers[j+1]) {
當j
為 2 時,它會將numbers[2]
與numbers[3]
進行比較。
沒有numbers[3]
。 這是未定義的行為。 循環關閉 1 個值。
此外,整體的冒泡排序實現是有缺陷的。 在所示代碼中,內部循環每次都遍歷整個數組(忽略 off-by-1 錯誤)。 在經典的冒泡排序中,第一次通過(外循環的第一次迭代)導致內循環遍歷整個數組並將最小/最大值“冒泡”到數組的末尾。 在下一次傳遞中,內部循環不需要迭代整個數組,而只需要迭代到數組的第二個最小/最大 position。 依此類推,每次通過(外循環)都會導致內循環迭代數組的越來越小的子集,將相應的值“冒泡”到適當的停止點。
除了修復 off-by-1 錯誤之外,如果您希望獲得完美的家庭作業成績,您還需要調整此冒泡排序的整體邏輯。
完全實施冒泡排序是有問題的。 在示例代碼中,內循環重復遍歷整個數組,同時忽略移位 1。在傳統冒泡排序的外循環的第一次迭代中,內循環遍歷整個數組,將最小/最大值“冒泡”到陣列的末端。 在隨后的迭代中,內部循環只需迭代到數組的第二小/最大點,而不是整個數組。 然后,內部循環遍歷數組的一個越來越小的子集,使關聯值的氣泡在外部循環中的每次連續運行中停止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.