【问题标题】:Bubblesort Driving me nuts泡泡排序让我抓狂
【发布时间】:2014-05-19 22:44:15
【问题描述】:

这是一个非常简单的问题。我用冒泡排序代码在网上查了一下,看起来我也在做同样的事情。这是我带有模板的完整 C++ 代码。但是输出有点奇怪!

#include <iostream>

using namespace std;

template <class T>
void sort(T a[], int size){
    for(int i=0; i<size; i++){
        for(int j=0; j<i-1; j++){
            if(a[j+1]>a[j]){
                cout<<"Yes at j="<<j<<endl;
                T temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }
}

int main(){
    int a[] = {1,2,6,3,4,9,8,10};
    sort<int>(a,8);
    for(int i = 0; i<8; i++){
        cout<<a[i]<<endl;
    }
    return 0;
}

输出:

但是当我稍微改变逻辑以尝试按升序对其进行排序时。即改成:if(a[j+1]&lt;a[j]),输出没问题!

我哪里做错了?

提前致谢!

【问题讨论】:

  • 你是using namespace std;,但是你去命名与std::sort相同的东西。不要使用命名空间,也不要确保命名不同。
  • 为什么输出很奇怪?这些数字在我看来是有序的。编辑:我看到你想要在第一种情况下升序。好的。
  • @PaulMcKenzie :不是第一个案例!
  • @PaulMcKenzie 看第一张截图。
  • @cipher 对你仍然有问题并不感到惊讶,但你应该注意这种事情。这是引入命名空间的主要原因(即防止命名冲突)。您会发现许多 C++ 开发人员从不使用 usingstd

标签: c++ algorithm sorting bubble-sort


【解决方案1】:

您的代码的问题是您尝试将内容向下冒泡,但向上循环。如果你想让东西向下冒泡,你需要向下循环,这样一个需要向下的元素就会向下直到它需要的地方。否则,对于i 的每次迭代,您只知道一个元素可能会向下冒泡一个空格。

同样,如果你向上冒泡,你也需要向上循环。

如果您想看看会发生什么,这里是您的代码和一些输出语句,这样您就可以了解正在发生的事情:

#include <iostream>

using namespace std;

template <class T>
void sort(T a[], int size){
    for(int i=0; i<size; i++){
        cout << "i: " << i << endl;
        for(int j=0; j<i-1; j++){
            if(a[j+1]>a[j]){
                cout << "\t Yes at j = " << j << endl;
                T temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;

                for(int k = 0; k < size; k++) {
                    cout << "\t a[" << k << "]: " << a[k] << endl;
                }

                cout << endl;
            }
        }

        cout << "\n" << endl;
    }
}

int main(){
    int a[] = {1,2,6,3,4,9,8,10};

    cout << "initially:" << endl;
    for(int k = 0; k < 8; k++) {
        cout << "a[" << k << "]: " << a[k] << endl;
    }

    cout << "\n" << endl;

    sort<int>(a,8);
    cout << "\n sorted:" << endl;
    for(int i = 0; i<8; i++){
        cout << a[i] << endl;
    }
    return 0;
}

如果您运行此程序,您会看到对于索引较高的条目,没有足够的迭代将它们一直冒泡到它们需要去的地方。

另外,这里的代码修复了你的冒泡(即以相反的顺序排序):

#include <iostream>

using namespace std;

template <class T>
void sort(T a[], int size){
    for(int i=0; i<size; i++){
        cout << "i: " << i << endl;
        for(int j=size - 1; j>i; j--){
            if(a[j-1]<a[j]){
                cout << "\t Yes at j = " << j << endl;
                T temp = a[j];
                a[j] = a[j-1];
                a[j-1] = temp;
            }
        }
    }
}

int main(){
    int a[] = {1,2,3,4,5,6,8,10};
    sort<int>(a,8);
    cout << "\n sorted:" << endl;
    for(int i = 0; i<8; i++){
        cout << a[i] << endl;
    }
    return 0;
}

【讨论】:

  • 谢谢!对理解有很大帮助!
【解决方案2】:

使用冒泡排序时,您需要记住“冒泡”的移动方向。您首先必须从所有数组中选择最大/最小元素并将其移动到位置n-1 的末尾。然后选择下一个并将其移动到位置n

  for (int i=size; i>1; i=i-1) { // << this is different
    for (int j=0; j<i-1; j=j+1) {
      if (a[j] < a[j+1]) {
        std::swap(a[j], a[j+1]);
      }
    }
  }

请参阅here 以获得更好的实施。

【讨论】:

  • 对“错误”行的解释或识别将使其成为有用的答案。
  • 谢谢!但是有一个问题:在更改第一个循环顺序后,现在只需更改&gt;&lt; 即可以相反的顺序对循环进行排序。那么,以前,我的提升是开箱即用的吗?
  • @cipher:这只是运气。试试这个int a[] = {9,8,7,6,5,4,3,2};,我们看到它失败了。
【解决方案3】:

这是一个逻辑问题:

for(int i = 0; i < size; i++){
    for(int j = 0; j < (i); j++){
        if(a[i] > a[j]){
            cout<<"Yes at j="<<j<<endl;
            T temp = a[j];
            a[j] = a[i];
            a[i] = temp;
        }
    }
}

您应该将a[j+1] 更改为a[i]

【讨论】:

    【解决方案4】:

    您正在比较和交换错误的数字,请在此处查找差异:

    template <class T>       
    void sort(T a[], int size){
       for(int i = 0; i < size; i++){
           for(int j = i+1; j < size; j++){
                   if(a[i] < a[j]){                                                                                                                                                                                 
                      cout << "Yes at j=" << j << endl;
                      //swap(a[j], a[j+1]);
                      T temp = a[j];
                      a[j] = a[i];
                      a[i] = temp;
              }            
          }                
      }                    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 2010-11-19
      • 1970-01-01
      • 2013-10-09
      • 1970-01-01
      • 2015-09-12
      • 2014-03-26
      • 2015-03-06
      相关资源
      最近更新 更多