簡體   English   中英

C++ 冒泡排序算法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM