是否只有一种方法可以实现气泡排序算法

Is there only one way to implement a bubble sort algorithm?

本文关键字:实现 气泡 算法 排序 方法 一种 是否      更新时间:2023-10-16

我试图在不在线查看任何伪代码的情况下实现自己的气泡排序算法,但现在我已经成功做到了,我的代码看起来与我在网上看到的示例非常不同。它们都涉及处理 true 或 false 的交换变量。我的实现根本不包括这一点,所以我没有进行气泡排序吗?

这是我在网上看到的一个例子:

for i = 1:n,
swapped = false
for j = n:i+1, 
    if a[j] < a[j-1], 
        swap a[j,j-1]
        swapped = true
→ invariant: a[1..i] in final position
break if not swapped

结束

这是我的实现:

void BubbleSort(int* a, int size)
{
    while (!arraySorted(a, size))
    {
        int i = 0;
        while (i < (size-1))
        {
            if (a[i] < a[i+1])
            {
                i++;
            }
            else
            {
                int tmp = 0;
                tmp = a[i+1];
                a[i+1] = a[i];
                a[i] = tmp;
                i++; 
            }
        }
    }
}

它做同样的工作,但它做的不同吗?

正如一些人指出的那样,没有标志的版本可以工作,但速度非常慢。

但是,如果您采用原始版本并扔掉标志(连同break),它仍然可以工作。从您方便地发布的不变量中很容易看出。

没有中断的版本具有与中断大致相同的最坏情况性能(最坏情况是按相反顺序排序的数组)。如果您想要一个保证在预定义时间内完成的算法,它比原始算法更好。

维基百科描述了优化气泡排序的另一个想法,其中包括扔掉break