[英]Which one is the real Bubble Sort, and which one is better?
我和朋友讨论过以下两种算法的真实冒泡类型,以及哪一种更好,没有提到哪一种是我的,我只是想听听你对这两个算法的两个问题的答案(用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;
} }
第二个更接近真实的一个。 所有比较应该在相邻元素之间。
但真正的冒泡排序需要一个while
循环而不是外部for
循环,而while
循环只有在最后一次传递时必须交换元素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);
}
嵌套循环冒泡排序的伪代码是:
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的回答:两者都没有“更好”。 两者都是O(n ^ 2)排序算法(这很糟糕)。 除了对排序算法的介绍之外,冒泡排序也没用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.