Bubblesort让我疯了

时间:2014-04-07 15:24:45

标签: c++ algorithm sorting bubble-sort

这是一个非常简单的问题。我在线查看了冒泡排序代码,看起来我也在做同样的事情。这是我带有模板的完整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;
}

输出:

The Output

但是当我略微改变逻辑以尝试按升序排序时。即,改为:if(a[j+1]<a[j]),输出正常!

The next output

我在哪里做错了?

提前致谢!

4 个答案:

答案 0 :(得分:6)

您的代码存在的问题是,您尝试向下冒泡,但是向上循环。如果你想把东西搞砸,你需要向下循环,这样一个需要下降的元素就会下降到需要的程度。否则,对于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;
}

答案 1 :(得分:4)

使用冒泡排序时,您需要记住“气泡”移动的方向。首先必须从所有数组中选择最大/最小元素,然后将其移动到位置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以获得更好的实施方案。

答案 2 :(得分:0)

这是一个逻辑问题:

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]

答案 3 :(得分:0)

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

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