哪一种是真正的冒泡排序,哪一种更好?
Posted
技术标签:
【中文标题】哪一种是真正的冒泡排序,哪一种更好?【英文标题】:Which one is the real Bubble Sort, and which one is better? 【发布时间】:2011-05-19 21:00:15 【问题描述】:我和朋友就以下两种算法的真正冒泡排序发生了争执,关于哪一种更好,不说哪一种是我的,我只是想听听你对这两个算法的回答(用 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;
【问题讨论】:
应该注意的是,冒泡排序绝不应该在任何类型的生产代码中使用,因为与其他基于比较的排序(例如插入排序)相比,它显然很糟糕,例如,它很容易实现但优于冒泡排序在几乎(如果不是全部)情况下进行排序。我什至说冒泡排序不应该再教了。 Python 在大厅的下方,右侧第二个门。认真:使用C缩进;不要伪装。 【参考方案1】:第二个更接近真实的。所有比较都应该在相邻元素之间进行。
但真正的冒泡排序将采用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);
【讨论】:
我认为您需要在每次通过后重新初始化交换为 false,不是吗?【参考方案2】:嵌套循环冒泡排序的伪代码是:
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 之后的元素。您展示的第二种方法有一个内部循环,它遍历所有元素,即使 i 之前的元素已经排序,所以没有必要在它们上浪费时间。
也就是说第一种方法也更好。
【讨论】:
但是在他的第一个方法中,他比较的是 Arr[i] 和 Arr[j],而不是 Arr[j-1] 和 Arr[j]【参考方案3】:问题 #2 的答案:两者都不是“更好”。两者都是 O(n^2) 排序算法(这很糟糕)。除了介绍排序算法之外,冒泡排序没什么用。
【讨论】:
以上是关于哪一种是真正的冒泡排序,哪一种更好?的主要内容,如果未能解决你的问题,请参考以下文章