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

Bubble sort with modification (offset)

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

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

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

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

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

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

在每一次新的迭代中,都会增加一个元素。所以你可以将下一个内部循环计数减少 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--;
}

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