冒泡排序坏了
bubble sort broken
我正在尝试编写冒泡排序代码。我找不到错误,我认为这与交换有关。有人能告诉我错误在哪里吗?它在数组末尾抛出一些不需要的元素。
#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);
}
你的for
循环中的最大索引是5,但是数组的大小只有4。访问array[4]
很可能会修改其他局部变量,比如a
、b
和 f
。
您的 swap
永远不会在您的代码中调用。 array[i]
returns int&
而你对 swap
的调用实际上调用了 std::swap
.
在我看来,using namespace std
不是一个好习惯。
如果你说"Its throwing some unwanted elements at the end of the array",我猜问题出在索引上。内部循环从数组末尾向下迭代到 b
(含),但您将元素与前一个元素进行比较。外循环的第一次迭代 (b = 0
) 内循环将迭代 4, 3, 2, 1, 0
。在最后一刻,它会比较 array[0]
与 array[-1]
。即使没有抛出异常,天知道这个内存位置包含什么(我猜这个值大于你用作输入的最小元素)。在一天结束时,您的最小元素进入位置数组 [-1](非常危险...),而垃圾进入(可能)数组的最后一个元素。
另一个问题是数组的最后一个 "element" (array[4]
) 实际上是存储变量 a
(最有可能)的内存位置。当您从流 (a = 4
) 中读取最后一个元素时,您将使用输入值覆盖此变量。接下来发生什么? a++
。 "last element" 正在递增。如果不小心它大于 4,则退出循环。
您的代码还有许多其他问题,但这些是观察到的行为的最可能原因。
将数组[4]更改为数组[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);
}
您对数组大小感到困惑。其实很简单,你想要一个大小为 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(array[f],array[f-1]);
应该是
swap(&array[f],&array[f-1]);
我正在尝试编写冒泡排序代码。我找不到错误,我认为这与交换有关。有人能告诉我错误在哪里吗?它在数组末尾抛出一些不需要的元素。
#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);
}
你的
for
循环中的最大索引是5,但是数组的大小只有4。访问array[4]
很可能会修改其他局部变量,比如a
、b
和f
。您的
swap
永远不会在您的代码中调用。array[i]
returnsint&
而你对swap
的调用实际上调用了std::swap
.
在我看来,using namespace std
不是一个好习惯。
如果你说"Its throwing some unwanted elements at the end of the array",我猜问题出在索引上。内部循环从数组末尾向下迭代到 b
(含),但您将元素与前一个元素进行比较。外循环的第一次迭代 (b = 0
) 内循环将迭代 4, 3, 2, 1, 0
。在最后一刻,它会比较 array[0]
与 array[-1]
。即使没有抛出异常,天知道这个内存位置包含什么(我猜这个值大于你用作输入的最小元素)。在一天结束时,您的最小元素进入位置数组 [-1](非常危险...),而垃圾进入(可能)数组的最后一个元素。
另一个问题是数组的最后一个 "element" (array[4]
) 实际上是存储变量 a
(最有可能)的内存位置。当您从流 (a = 4
) 中读取最后一个元素时,您将使用输入值覆盖此变量。接下来发生什么? a++
。 "last element" 正在递增。如果不小心它大于 4,则退出循环。
您的代码还有许多其他问题,但这些是观察到的行为的最可能原因。
将数组[4]更改为数组[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);
}
您对数组大小感到困惑。其实很简单,你想要一个大小为 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(array[f],array[f-1]);
应该是
swap(&array[f],&array[f-1]);