带修改的冒泡排序(偏移)

时间:2018-03-22 20:22:49

标签: c++ offset bubble-sort

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

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

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

如何修改它以完成任务?代码看起来如何?

2 个答案:

答案 0 :(得分:2)

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

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

在每次新迭代中,还有一个元素是有序的。因此,您可以将下一个内循环计数减少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--;
}

答案 1 :(得分:1)

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