我只想弄清楚使用冒泡排序交换项目的次数。
当我在Windows上实现它时,它可以完美运行。但是在使用g ++的Linux上实现它,输出完全不同,我疯狂地试图找出错误。
这是我的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;
}
任何人都可以看到这段代码有什么问题可能会给我带来Windows和Linux之间的问题吗?
测试输入: 服装CAD
应该返回6,但G ++返回10
答案 0 :(得分:3)
我修改了你的代码以提供一个完整的工作程序:
#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");
}
在具有g++
的64位Linux计算机上编译它。跑吧。结果:
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("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对待行尾的方式不同。
答案 1 :(得分:0)
应修改您的循环终止条件,以便进行不必要的比较:
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++;
}
}
}
在每次迭代后,最后一个元素始终排序。