C++ 带G+的冒泡排序+;

C++ 带G+的冒泡排序+;,c++,linux,algorithm,g++,bubble-sort,C++,Linux,Algorithm,G++,Bubble Sort,我只是想用冒泡排序来计算一个项目被交换了多少次 当我在Windows上实现它时,它可以完美地工作。但是用g++在Linux上实现它,结果完全不同,我正在疯狂地试图找出这个bug 这是我的bubbleSort函数 int bubbleSort(string s){ int num = 0; // Bubble sort string and count inversions on each swap for (int i = 0; i < s.length(); i++) { fo

我只是想用冒泡排序来计算一个项目被交换了多少次

当我在Windows上实现它时,它可以完美地工作。但是用g++在Linux上实现它,结果完全不同,我正在疯狂地试图找出这个bug

这是我的bubbleSort函数

int bubbleSort(string s){
int num = 0;

// Bubble sort string and count inversions on each swap
for (int i = 0; i < s.length(); i++) {
    for(int j = 0; j < s.length() - 1; j++) {
        if(s[j] > s[j+1]) {
            swap(s[j], s[j+1]);
            num++;
        }
    }
}
return num;
}
int-bubbleSort(字符串s){
int num=0;
//每个交换上的气泡排序字符串和计数反转
对于(int i=0;is[j+1]){
互换(s[j],s[j+1]);
num++;
}
}
}
返回num;
}
有人能看出这段代码有什么问题吗?它可能会给我带来Windows和Linux之间的问题

测试输入: GCAD


应返回6,但G++返回10

应修改循环终止条件,以便执行不必要的比较,如下所示:

for (int i = 0; i < s.length()-1; i++) {         
    for(int j = 0; j < s.length() - i - 1; j++) {
        if(s[j] > s[j+1]) {
            swap(s[j], s[j+1]);
            num++;
        }
    }
}
for(inti=0;is[j+1]){
互换(s[j],s[j+1]);
num++;
}
}
}

正如每次迭代之后一样,最后一个元素总是被排序。

我修改了您的代码以提供完整的工作程序:

#include <iostream>

int bubbleSort(std::string s) {
  int num = 0;
  for (int i = 0; i < s.length(); i++) {
    for(int j = 0; j < s.length() - 1; j++) {
      if(s[j] > s[j+1]) {
        std::swap(s[j], s[j+1]);
        num++;
        std::cout << "num is " << num << " and string is " << s << "\n";
      }
    }
  }
}

int main(void) {
  bubbleSort("ZWQM");
}
六次迭代,字符串被排序。请确认此精确程序不会为您生成此精确输出。。。告诉我们它的作用

编辑我找到了一种方法来获得答案
10
!我在字符串中添加了一个换行符

bubbleSort("ZWQM\n");
导致

num is 1 and string is WZQM

num is 2 and string is WQZM

num is 3 and string is WQMZ

num is 4 and string is WQM
Z
num is 5 and string is QWM
Z
num is 6 and string is QMW
Z
num is 7 and string is QM
WZ
num is 8 and string is MQ
WZ
num is 9 and string is M
QWZ
num is 10 and string is
MQWZ

请注意,当回车符“冒泡”到第一个字符位置时,它是如何干扰输出的。我现在99%确信,您观察到的差异与您如何将字符串输入程序有关,并且Windows和Linux对行尾的处理方式不同。

否。您得到的确切错误是什么?每个系统的输出是什么?您要传递什么字符串?程序是否会生成排序字符串?还是说它失败得更糟?您是否可以打印中间步骤(例如,当
num%10==0
时,
s
的值)。这是一个很长的过程。。。但可能是你有不同的字符编码吗?如果您使用
s.charAt(j)
而不是
s[j]
访问第j个元素,答案是否会改变?通过交换,您指的是std::swap函数吗?可能尝试手动交换s[j]和s[j+1]。现有循环如何访问越界数组?我已经尝试过了。以及其他五十种语法。运气不好,仍然会得到相同的结果。@AbhishekBansal它不会,但它会通过nullchar终止符运行,这很糟糕
0x00
比任何非空字符都“少”,因此它交换值,并且在这个过程中,每次迭代都会丢失一个字符(在现在移动的终止符的另一侧)。泡泡排序应该从1到(len-1)进行,并根据
s[j]
访问元素
s[j]
。OP很接近,只是索引错误。很抱歉,我肯定遗漏了什么。但是如何访问空终止符呢?例如,如果字符串为“abcd”,长度为4,最大值为j=2(AABC CDE变成
AAB BCDE
变成
AA ABCDE
?当字母与空格互换时,其ASCII值减少1°??显示您的
交换功能。
num is 1 and string is WZQM

num is 2 and string is WQZM

num is 3 and string is WQMZ

num is 4 and string is WQM
Z
num is 5 and string is QWM
Z
num is 6 and string is QMW
Z
num is 7 and string is QM
WZ
num is 8 and string is MQ
WZ
num is 9 and string is M
QWZ
num is 10 and string is
MQWZ