【问题标题】:bubble sort in descending order冒泡排序降序
【发布时间】:2021-04-26 02:09:42
【问题描述】:
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} 时,输出是

123 33 12 8 4 2 0

【问题讨论】:

  • 您有一个 off-by-1 错误。你的数组有元素 a[0] 到 a[6],但你从 7 开始循环。
  • 您的程序有时似乎可以工作只是巧合 - 您在数组外部进行索引,并且具有未定义的行为。
  • 如前所述,您有一个错误,但为什么要使用降序循环?它们更难理解,也许是你一开始就犯了一个错误的原因。仅仅因为您按降序排序并不意味着您必须使用降序循环进行冒泡排序。
  • for (int i = 0; i &lt; n; i++) ... 的反向循环是for (int i = n-1; i &gt;=0; i--)...。这里没有反向循环的意义。如果您这样做是为了练习,您现在已经注意到为什么每个人都讨厌反向循环。
  • @ayco 如果一个数组有 7 个元素,那么索引的有效范围是 [0, 7),也就是说你不能使用表达式 a[7]。

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


【解决方案1】:

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

在内循环中

    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 语句中的数组元素。

事实上,在循环的第一次迭代中,你有

        if (a[7] > a[6])

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

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

尽管如此,您更新后的程序可能看起来像下面这样

#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;
}

程序输出是

4 33 -1 8 12 123 2 
123 33 12 8 4 2 -1 

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    相关资源
    最近更新 更多