冒泡排序:为什么它不能正常工作?

时间:2016-12-01 13:46:58

标签: c++

当我输入1,2,3,4,5作为输入时。输出很好,因为它已经从最低到高排序。但是当我键入5,4,3,2,1时它输出:

4,3,2,1,5

顺便说一下,我正在尝试冒泡。

   main() {
        int a[5], i, smallest, temp;
        cout << "Enter 5 numbers: " << endl;
        for ( i = 0; i <= 4; i++ ) {
            cin >> a[i];
        }

        for ( i = 0; i <= 4; i++ ) {
            smallest = a[i];
            if ( smallest > a[i+1] ) {
                temp = a[i];
                a[i] = a[i+1];
                a[i+1] = temp;
            }
        }
        cout << endl << endl;

        for ( i = 0; i <= 4; i++ ) {
            cout << a[i] << endl;
        }
        system("pause");
    }

我在您的回复后确实将我的代码更改为:

for ( i = 0; i <=4; i++ ) {
    smallest = a[i];
    for ( j = 1; j <= 4; j++ ) {
        if ( smallest > a[j] ) {
            temp = a[i];
            a[i] = a[j];
            a[j] = temp;
        }
    }
}

我不知道为什么它不起作用。我真的很抱歉,因为我是编程中的菜鸟,所以请耐心等待我刚刚开始:)

任何帮助都将受到高度赞赏。

谢谢^。^

2 个答案:

答案 0 :(得分:6)

单次传递是不够的,你必须一遍又一遍地扫描数组,直到没有执行交换:

 bool sorted = false;

 while (!sorted) {
   sorted = true;   

   for ( i = 0; i <= 4 - 1; i++ ) { /* notice 4 - 1 since we address a[i + 1] */
        smallest = a[i];

        if ( smallest > a[i+1] ) {
            temp = a[i];
            a[i] = a[i+1];
            a[i+1] = temp;

            sorted = false;
        }
    } 
 }

答案 1 :(得分:1)

因为你的所有算法都是,所以将最大的数字移动到数组的末尾。由于bubble sort具有时间复杂度O(n²),因此使用两个嵌套循环是必要的。您可以重复编写的循环,直到对数组进行排序。请注意,这不是很有效,但它应该有效。

您还应该检查您是否不会访问超出数组范围的索引。