c++ - 冒泡排序忽略数组的第一个元素

标签 c++ arrays sorting for-loop bubble-sort

我正在做作业,但不知道为什么冒泡排序不起作用。由于某些未知原因,它使数组的第一个元素为零。

#include <iostream>

using namespace std;

int main()
{
    int *arr,s;
    cout<<"Enter the quantity of numbers ";
    cin>>s;
    arr=new int[s];
    for(int i=0;i<s;i++)
    {
        cout<<"Enter number "<<i+1<<" ";
        cin>>*(arr+i);
    }
    int temp;
    for(int j=0;j<s;j++)
    {
        for(int k=0;k<(s-j);k++)
        {
            if(*(arr+k)>*(arr+k+1))
            {
                temp=*(arr+k);
                *(arr+k)=*(arr+k+1);
                *(arr+k+1)=temp;
            }
        }
    }
    for(int x=0;x<s;x++)
    {
        cout<<*(arr+x)<<"\t";
    }
    cout<<endl;
    return 0;
}

输出

Enter the quantity of numbers 5
Enter number 1 4
Enter number 2 33
Enter number 3 22
Enter number 4 1
Enter number 5 3
0       1       3       4       22

我不知道为什么第一个元素会变成零。如果我在没有冒泡排序循环的情况下运行它,它会完美运行,但不要使用这些循环。

最佳答案

在这个for循环中

    for(int k=0;k<(s-j);k++)
    {
        if(*(arr+k)>*(arr+k+1))
                      ^^^^^^^ 
        {
            temp=*(arr+k);
            *(arr+k)=*(arr+k+1);
            *(arr+k+1)=temp;
        }

j 时,尝试访问数组之外​​的内存等于0k等于s - 1 .即在这种情况下 k + 1等于s尽管索引的有效范围是 [0, s-1] .

至少按以下方式更改循环

for(int j=0;j<s;j++)
{
    for(int k = 1;k<(s-j);k++)
    {
        if(*(arr+k) < *(arr+k-1))
        {
            int temp=*(arr+k);
            *(arr+k)=*(arr+k-1);
            *(arr+k-1)=temp;
        }
    }
}

关于c++ - 冒泡排序忽略数组的第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47971792/

相关文章:

c++ - dataChanged 信号不适用于 ComboBoxDelegate

c - 如何在C中检查数组中的数字按降序排列

linux - 生成文件名以在 shell globing 下进行正确的顺序排序

sorting - mongoid排序问题

algorithm - 为什么选择排序不稳定?

c++ - 如何删除小部件

c++ - 结构 (C) 中的 malloc 错误

c++ - C++中多继承中使用的reinterpret_cast

arrays - strcmp() 函数仅适用于第一次迭代 C

java - 打印数组的反转时出现 ArrayIndexOutOfBoundsException