首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冒泡降序排序

冒泡降序排序
EN

Stack Overflow用户
提问于 2021-01-21 23:58:35
回答 1查看 259关注 0票数 1
代码语言:javascript
复制
int main()
{
    int a[7] = {4,33,11,8,12,123,2}, temp;

    for (int i = 7; i >= 0; i--)
    {
        for (int j = 7; j > 7 - i; j--)
        {
            if (a[j] > a[j - 1])
            {
                temp = a[j];
                a[j] = a[j - 1];
                a[j - 1] = temp;
            }
        }
    }

    for (int i = 0; i < 7; i++)
        cout << a[i] << " ";

}

嘿,我想对数字进行气泡降序排序,但我有一个问题,我的代码可以使用(ai >= 0),当我输入负数时,会给出错误的输出。例如,当我输入{4,33,-1,8,12,123,2}时,输出为

代码语言:javascript
复制
123 33 12 8 4 2 0
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 00:37:00

您的程序具有未定义的行为,因为在循环中,您试图访问数组之外的内存。

这是在内部循环中

代码语言:javascript
复制
    for (int j = 7; j > 7 - i; j--)
    {
        if (a[j] > a[j - 1])
        {
            temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
        }
    }

变量j的初始值是7,您将使用该值在if语句中访问数组的元素。

实际上,在循环的第一次迭代中,您拥有

代码语言:javascript
复制
        if (a[7] > a[6])

7不是访问数组元素的有效索引。

使用从0开始的索引来编写循环会更简单。您需要做的就是更改if语句中的比较表达式。

不过,您的更新后的程序可能如下所示

代码语言:javascript
复制
#include <iostream>

int main() 
{
    int a[] = { 4, 33, -1, 8, 12, 123, 2 };
    const size_t N = sizeof( a ) / sizeof( *a );
        
    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';

    for ( size_t i = N; i != 0; --i )
    {
        for ( size_t j = N; --j != N - i;   )
        {
            if ( a[j-1] < a[j] )
            {
                int tmp = a[j];
                a[j] = a[j-1];
                a[j-1] = tmp;
            }
        }
    }
        
    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';
    
    return 0;
}

程序输出为

代码语言:javascript
复制
4 33 -1 8 12 123 2 
123 33 12 8 4 2 -1 

一种更灵活的方法是编写一个单独的模板函数,它排除了前向迭代器类别中的两个迭代器。

在这种情况下,要按降序对数组进行排序,使用反向迭代器调用函数就足够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65831093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档