【问题标题】:Is there only one way to implement a bubble sort algorithm?是否只有一种方法可以实现冒泡排序算法?
【发布时间】:2013-11-07 05:50:50
【问题描述】:

我试图实现我自己的冒泡排序算法而不查看任何在线伪代码,但现在我已经成功完成了,我的代码看起来与我在网上看到的示例完全不同。它们都涉及处理一个真或假的交换变量。我的实现根本不包括那个,所以我没有做冒泡排序吗?

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

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

它做同样的工作,但做起来有什么不同吗?

【问题讨论】:

  • 您的版本慢了一倍,因为arraySorted 的成本与循环体的迭代一样多。
  • @Raymond Chen 所以基本上交换变量是绝对必要的?
  • 您是否了解这对索引沿序列向上移动的前提?在 any 给定的传递中,如果任何给定的相邻元素都没有发生交换,则序列按定义排序,您就完成了。检测到发生了交换,因此需要另一次通过是该标志的根本原因。
  • @WhozCraig 对。所以当排序过程本身应该确定它是否被排序时,我只是让它不必要地迭代?
  • 是的,每次通过都会评估该标志一次,这将击败裤子每次通过扫描序列。

标签: c++ sorting bubble-sort


【解决方案1】:

正如一些人所指出的,您的没有标志的版本可以工作,但是速度太慢了。

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

不带中断的版本在最坏情况下的性能与带中断的版本大致相同(最坏情况是数组以相反的顺序排序)。如果您想要一种保证在预定义时间内完成的算法,它比原来的要好。

维基百科描述了冒泡排序的another idea for optimization,其中包括丢弃break。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多