哪一个是真正的冒泡排序,哪一个更好?

时间:2010-12-03 17:00:30

标签: c++ algorithm bubble-sort

我与朋友讨论过以下两种算法的真实冒泡类型,哪种更好,没有提到哪一种是我的,我只想听听你对这两个算法的这两个问题的答案(用c ++编写)

1 - 哪一个是真正的冒泡排序?
2哪个更好?

这是两种算法:

// Number one :
void BubbleSort(int Arr[], int size)
{   for (int i=0;i<size-1;i++)
        for (int j=i+1;j<size;j++)
            if (Arr[i]>Arr[j])
            {   int temp = Arr[i];
                Arr[i] = Arr[j];
                Arr[j] = temp;
}           }

// Number two : 
void BubbleSort(int Arr[], int size)
{   for (int i=0;i<size-1;i++)
        for (int j=0;j<size-1;j++)
            if (Arr[j]>Arr[j+1])
            {   int temp = Arr[j];
                Arr[j] = Arr[j+1];
                Arr[j+1] = temp;
}           }

3 个答案:

答案 0 :(得分:11)

第二个更接近真实的一个。所有比较都应该在相邻元素之间进行。

但真正的冒泡排序会采用while循环而不是外部for循环,只有在最后一次传递时必须交换元素时,while循环才会再次执行,像这样:

void BubbleSort(int Arr[], int size) 
{   
    bool swapped;
    do {
        swapped = false;
        for (int j=0;j<size-1;j++)
            if (Arr[j]>Arr[j+1]) {
                int temp = Arr[j];
                Arr[j] = Arr[j+1];
                Arr[j+1] = temp;
                swapped = true;
            }
    } while (swapped);
}

答案 1 :(得分:1)

嵌套循环冒泡排序的伪代码是:

procedure bubbleSort( A : list of sortable items ) 
  n := length(A)-1
  for(i=0; i<= n; i++) 
     for(j=n; j>i; j--) 
        if A[j-1] > A[j] then
           swap (A[j-1], A[j])
        end if
     end for
  end for
end procedure

这意味着第一个是最接近的,因为内部循环仅在i之后迭代元素。你展示的第二种方法有一个内循环,迭代所有元素,即使我已经排序了元素,所以没有必要浪费时间。

这意味着第一种方法也更好。

答案 2 :(得分:1)

问题#2的答案:两者都不是&#34;更好&#34;。两者都是O(n ^ 2)排序算法(这很糟糕)。除了对排序算法的介绍之外,冒泡排序也没用。

相关问题