C++ 泡泡糖快把我逼疯了

C++ 泡泡糖快把我逼疯了,c++,algorithm,sorting,bubble-sort,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

这是一个非常简单的问题。我在网上用冒泡排序代码进行了检查,看起来我也在这样做。这是我的完整的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;
}
#包括
使用名称空间std;
模板
无效排序(T a[],整数大小){

对于(int i=0;i使用气泡排序时,需要记住“气泡”移动的方向。首先必须从所有数组中选取最大/最小的元素,并将其移动到位置
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]);
      }
    }
  }
对于(int i=size;i>1;i=i-1){/这是一个逻辑问题:

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;
        }
    }
}
for(int i=0;ia[j]){

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

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;
          }            
      }                
  }                    
}
模板
无效排序(T a[],整数大小){
对于(int i=0;icout您的代码的问题是,您试图向下冒泡,但向上循环。如果您想向下冒泡,则需要向下循环,以便需要向下的元素可以向下循环。否则,每次迭代
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;
}
#包括
使用名称空间std;
模板
无效排序(T a[],整数大小){

对于(int i=0;iYou
正在使用名称空间std;
,但随后你去命名与相同的东西。不要使用名称空间或确保命名不相同。为什么输出很奇怪?我看数字是按顺序排列的。编辑:我看到你在第一种情况下需要升序。好的。@PaulMcKenzie:在第一种情况下不是这样!@PaulMcKenzie查看第一个截图。@ CiPHER并不惊讶你仍然有问题,但是你应该注意这类事情。这是引入命名空间的一个主要原因(即防止命名冲突)。你会发现许多C++开发者从不使用<代码>使用< /C> > <代码> STD 。对错误的解释或识别。行将使这成为一个有用的答案。谢谢!但有一个问题:在更改第一个循环顺序后,现在只需更改
@cipher:这只是运气。试试这个
int a[]={9,8,7,6,5,4,3,2};
,我们看到它失败了。谢谢!在理解上帮助了很多!
#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;
}