使用 G++ 进行气泡排序

Bubble Sort with G++

本文关键字:气泡 排序 G++ 使用      更新时间:2023-10-16

我只是想弄清楚使用气泡排序交换了多少次项目。

当我在Windows上实现它时,它可以完美地工作。但是使用 g++ 在 Linux 上实现它,输出完全不同,我疯狂地试图找出错误。

这是我的气泡排序函数

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

任何人都可以看到这段代码有什么问题,可能会给我在 Windows 和 Linux 之间带来问题吗?

测试输入:GCAD

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

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

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

在 64 位 Linux 机器上编译了它,g++ .运行它。结果:

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 QWMZ
num is 5 and string is QMWZ
num is 6 and string is MQWZ

六次迭代,字符串排序。请确认此确切程序不会为您生成此确切输出...并告诉我们它的作用。

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

bubbleSort("ZWQMn");

结果在

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 以不同的方式处理行尾。

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

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

与每次迭代一样,最后一个元素始终被排序。