C++ 带G+的冒泡排序+;
我只是想用冒泡排序来计算一个项目被交换了多少次 当我在Windows上实现它时,它可以完美地工作。但是用g++在Linux上实现它,结果完全不同,我正在疯狂地试图找出这个bug 这是我的bubbleSort函数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
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