冒泡排序微小错误

时间:2016-05-07 19:04:11

标签: c++

我正在尝试让我的程序将这个数字数组从最小到最大排序,但输出却以其他方式输出。换句话说,我试图不使用[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;
}

2 个答案:

答案 0 :(得分:1)

您有三个错误:

错误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循环才会被执行。如果if循环中的for条件从未执行(意味着没有发生交换,因此数据已排​​序),您将知道何时对数据进行排序。

以下是一个例子:

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

答案 1 :(得分:0)

已经有一个名为&#34; algorithm&#34;的头文件。你可以做到这一点:

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

我希望我帮助过你。