气泡排序微小错误

Bubble sort tiny error

本文关键字:错误 排序 气泡      更新时间:2023-10-16

我正试图让我的程序从最小到最大对这个数字数组进行排序,但结果却是相反的。换句话说,我尽量不使用[4],因为这就是这个算法的作用,但我不知道怎么做。感谢阅读。

输出:9 12 3 14

#include <iostream>
using namespace std;
int main() {
    int a[4] = {12, 9, 14, 3};
    int temp;
    for(int i = 0; i < 4; i++) {
        if(a[i] > a[i + 1]) {
            temp = a[i];
            a[i] = a[i + 1];
            a[i + 1] = temp;
        }
        cout << a[i] << " ";
    }
    return 0;
}

您有三个错误:

错误1: 循环期间的越界访问

此:

    for(int i = 0; i < 4; i++) 

应该是

    for(int i = 0; i < 3; i++) 

原因是,如果你使用第一个(错误的)版本,你就会出现缓冲区溢出:

    if(a[i] > a[i + 1])  // if i == 3, a[3+1] == a[4] == out-of-bounds

错误2:排序时写入输出

你这样做:

    cout << a[i] << " ";

在排序的中间。如果排序尚未完成,则打印出数组的值是没有意义的。

这应该放在分拣代码之外(一旦分拣完成):

 for ( int i = 0; i < 4; ++i)
    cout << a[i] << " ";

错误3:气泡排序的错误实现。

冒泡排序的工作原理是对数据进行多次遍历,直到检测到数据已排序。您的代码只对数据进行一次传递,然后退出。

您需要做的是创建一个while或类似的循环,即for循环。只有当数据需要至少再通过一次数据时,才会执行while循环。如果for循环中的if条件从未执行(意味着没有发生交换,因此数据被排序),您将知道数据何时被排序。

这里有一个例子:

int temp;
bool is_sorted = false;
while ( !is_sorted )  // execute while data is not sorted
{
    isSorted = true;  // assume data is sorted
    for(int i = 0; i < 3; i++)
    {
       if(a[i] > a[i + 1])
       {
          //.. swap the items
          //...
          isSorted = false;  // swap made, so data was not sorted
       }
    }
}

已经有一个名为"算法"的头文件可以实现这一点:

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<char, int> new_pair;
struct sorting{
       bool operator() (int i, int j){return i < j;}
}test_sort;
int main(void){
        int test[4] = {5, 2, 1, 10};
        sort(test, test + 3, test_sort);
        for(int i = 0; i <= 3; i++){
                cout <<test[i] << endl;
        }
        return 0;
}

我希望我能帮助你。