冒泡排序坏了

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);
}
  1. 你的for循环中的最大索引是5,但是数组的大小只有4。访问array[4]很可能会修改其他局部变量,比如abf

  2. 您的 swap 永远不会在您的代码中调用。 array[i] returns int& 而你对 swap 的调用实际上调用了 std::swap.

  3. 在我看来,
  4. 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而不是45的混合,它更容易理解。

您的交换功能不起作用,并且没有被正确调用。您的版本交换 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]);