【问题标题】:Bubble sort with modification (offset)带修改(偏移)的冒泡排序
【发布时间】:2018-03-22 20:22:49
【问题描述】:

我的任务是写冒泡排序修改,其中比较的次数减少了大约一半。

我已经编写了我的标准冒泡排序算法:

void bubble_sort(int* tab, int roz)
{
    int test;
    for (int i = 0; i < roz; i++)
    {
        for (int j = 1; j < roz; j++)
        {
            if (tab[j - 1] > tab[j])
            {
                test = tab[j - 1];
                tab[j - 1] = tab[j];
                tab[j] = test;
            }
        }
    }
}

以及如何修改它以共同完成任务?代码会是什么样子?

【问题讨论】:

    标签: c++ offset bubble-sort


    【解决方案1】:

    您可以使用以下方法优化您的解决方案:

    在算法的第一次迭代中,您肯定知道最后一个元素是最大的。所以它已经有条不紊了。无需循环到内部循环中的数组末尾。

    在每次新的迭代中,都会增加一个元素。因此,您可以将下一个内部循环计数减少 1。

    我冒昧地修改了一点你的解决方案。

    int lastUnsorted = n - 1;
    bool isSorted = false;
    
    while (!isSorted)
    {
        isSorted = true;
        for (int i = 0; i < lastUnsorted; i++)
        {
            if (arr[i] > arr[i + 1])
            {
                isSorted = false;
                int temp = arr[i + 1];
                arr[i + 1] = arr[i];
                arr[i] = temp;
            }
        }
        lastUnsorted--;
    }
    

    【讨论】:

    • 非常感谢纳斯!我有一个问题,为什么 lastUnsorted = n - 1?
    • 我们正在循环中访问 arr[i + 1]。因此,如果我们在最后一次迭代中不将迭代次数减少 1,则 i + 1 将超出数组的边界。
    【解决方案2】:

    您可以将 for (int j = 1; j &lt; roz; j++) 更改为 for (int j = 1; j &lt; roz-i; j++) 以仅遍历数组中未排序的元素。这将步数从 88 个减少到 68 个,大约减少了四分之一。

    【讨论】:

      猜你喜欢
      • 2018-06-30
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2014-03-17
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多