C++ 泡沫破裂
我正在尝试编写一个冒泡排序。我找不到错误,我想这与交换有关。有人能告诉我虫子在哪里吗?它在数组的末尾抛出一些不需要的元素C++ 泡沫破裂,c++,bubble-sort,C++,Bubble Sort,我正在尝试编写一个冒泡排序。我找不到错误,我想这与交换有关。有人能告诉我虫子在哪里吗?它在数组的末尾抛出一些不需要的元素 #包括 #包括 使用名称空间std; 无效交换(int*a,int*b){ int*c; c=a; a=b; b=c; 返回; } int main() { int数组[4],a=0; 库特 循环的最大索引为5,但数组大小仅为4。访问数组[4]可能会修改其他局部变量,如a、b和f 您的swap从未在代码中调用。array[i]返回int&,而您对swap的调用实际上调用了st
#包括
#包括
使用名称空间std;
无效交换(int*a,int*b){
int*c;
c=a;
a=b;
b=c;
返回;
}
int main()
{
int数组[4],a=0;
库特
循环的最大索引为5,但数组大小仅为4。访问数组[4]
可能会修改其他局部变量,如a
、b
和f
您的swap
从未在代码中调用。array[i]
返回int&
,而您对swap
的调用实际上调用了std::swap
在我看来,使用命名空间std
不是一个好习惯
如果你说“它在数组的末尾抛出了一些不需要的元素”,我想问题出在索引上。内部循环从数组的末尾迭代到b
(包括),但是你将该元素与前一个元素进行比较。而外部循环的第一次迭代(b=0
)内部循环将迭代4,3,2,1,0
。在最后一刻,它将比较array[0]
与array[-1]
。即使没有抛出异常,天知道这个内存位置包含什么(我猜该值大于用作输入的最小元素)。在一天结束时,最小的元素将进入位置数组[-1](非常危险…),垃圾将进入(可能)数组的最后一个元素
另一个问题是数组的最后一个“元素”(array[4]
)实际上是存储变量a
(最有可能)的内存位置。当您从流中读取最后一个元素(a=4
)时,您会用输入值覆盖此变量。接下来会发生什么?a++
。最后一个元素正在递增。如果意外地大于4,则退出循环
您的代码还有许多其他问题,但这些是观察到的行为的最可能原因。将数组[4]更改为数组[5],并将内部循环的条件从
for(int f=4;f>=b;f--)到for(int f=4;f>=(b+1);f--)
#包括
#包括
使用名称空间std;
无效交换(int*a,int*b){
int*c;
c=a;
a=b;
b=c;
返回;
}
int main(){
int数组[5],a=0;
cout您对数组大小感到困惑。实际上非常简单,您需要一个大小为5的数组,所以只需在代码中使用5
int数组[5];
notint数组[4];
for(a=0;a)您正在将5个元素存储到一个只有4个空间的数组中。还有一个问题:内部循环从4向下迭代到b(包括b)。但是比较的元素是[f]和[f-1]。因此,当外部循环(b=0)的第一次迭代时,将比较元素[0]和[-1]。最大索引在他的for
循环中,循环是4
,而不是5
。这仍然是个问题。谢谢@jerry_fuyi..帮助了很多..修复了..在我将数组长度增加了一个之后运行良好..只是怀疑为什么我们必须在数组中增加一个空间..而且使用sizeof(array)/sizeof(*array)也是一个好习惯
而不是在循环条件下硬编码长度。
#include<iostream>
#include<windows.h>
using namespace std;
void swap(int* a,int* b) {
int *c;
c=a;
a=b;
b=c;
return;
}
int main(){
int array[5],a=0;
cout<< "Enter 5 numbers to be bubble sorted"<<endl;
for (a=0; a<=4; a++)
{
std::cin >>array[a];
Sleep(1000);
}
for (int b=0;b<=4;b++)
{
for(int f=4;f>=(b+1);f--){
if (array[f]<array[f-1])
{
swap(array[f],array[f-1]);
}
}
}
for( int d=0; d<=4;d++){
cout << '\n';
cout << array[d]<< '\n';
}
return (0);
}
void swap(int* a,int* b) {
int c;
c=*a;
*a=*b;
*b=c;
}
swap(array[f],array[f-1]);
swap(&array[f],&array[f-1]);