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];
    not
    int数组[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]);