我正在尝试对冒泡排序进行编码。我找不到错误,我认为这与交换有关。有人可以告诉我错误在哪里吗?它在数组的末尾抛出了一些不需要的元素。
#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[4], 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; 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);
}
答案 0 :(得分:2)
for
循环中的最大索引为5,但数组的大小仅为4。访问array[4]
可能会修改其他局部变量,例如{{1} },a
和b
。
您的f
永远不会在您的代码中被调用。 swap
返回array[i]
,而您对int&
的调用实际上会调用swap
。
std::swap
不是一个好习惯。
答案 1 :(得分:2)
您对数组大小感到困惑。这实际上非常简单,您需要一个大小为5的数组,因此只需在代码中到处使用5
int array[5];
不是int array[4];
for (a=0; a<5; a++)
不是for (a=0; a<=4; a++)
第二个没错,如果您始终使用5
而不是4
和5
的混合,那么更容易理解。
您的交换功能不起作用,未正确调用。您的版本交换 pointers 而不是所指向的内容。新手关于指针犯错误的更常见的事情之一是对指针和指针所指向的东西感到困惑。这是它的外观:
void swap(int* a,int* b) {
int c;
c=*a;
*a=*b;
*b=c;
}
最后,您错误地调用了swap函数。您的swap函数使用指针,因此您必须使用指针来调用它:
swap(array[f],array[f-1]);
应该是
swap(&array[f],&array[f-1]);
答案 2 :(得分:1)
如果您说“它在数组的末尾抛出了一些不需要的元素”,我想问题出在索引上。内部循环从数组的末尾向下迭代到b
(含),但是您将元素与前一个元素进行了比较。在外循环(b = 0
)的第一次迭代中,内循环将迭代4, 3, 2, 1, 0
。在最后一刻,它将比较array[0]
与array[-1]
。即使未引发异常,上帝也知道此内存位置包含什么(我猜该值大于用作输入的最小元素)。一天结束时,最小的元素将转到位置数组[-1](非常危险...),垃圾将到达(可能)数组的最后一个元素。
另一个问题是,数组(array[4]
)的最后一个“元素”实际上是变量a
(很可能是)的存储位置。当您从流(a = 4
)中读取最后一个元素时,将使用输入值覆盖此变量。接下来发生什么? a++
。 “最后一个元素”正在增加。如果偶然大于4,则退出循环。
您的代码还有很多其他问题,但这是观察到行为的最可能原因。
答案 3 :(得分:1)
将 array [ 4 ] 更改为 array [ 5 ] ,并将内部循环的条件从 for(int f = 4; f> = b ; f-)到 for(int f = 4; f> = (b + 1); f-)
#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);
}