这是什么类型的?

时间:2010-09-30 20:32:36

标签: c++ sorting bubble-sort

我正在阅读的C ++书籍描述了一种算法,说它是Bubblesort但我找不到像它一样的单一变体。我知道这些差异很小,但是它和常规的Bubbleort一样有效吗?

BubbleSort(int A[], int length)
for (j=0; j < length-1; j++)
  for (i=j+1; i < length; i++)
    if (A[i] < A[j])
      Swap()

基本上,它不是比较两个相邻的值,而是将第一个A [0]与每个条目进行比较,在下一个传递中它将A [1]与其余条目进行比较,然后是A [2]等。

它真的只是一个普通的气泡,特征和性能完全相同吗?

4 个答案:

答案 0 :(得分:1)

这是selection sort。在每一次传球中,你会找到第i个最小的元素并将它放在第i位置。在第一次通过之后,不再需要查看A [0],依此类推。选择排序是最坏情况O(n 2 )和最佳情况O(n),就像冒泡排序一样,但它具有比冒泡排序更小的常数因子。 Insertion sort,一个额外的改进,甚至更好,对于非常小的数组(少于十个元素左右),它比大多数O(n log n)算法更快,因此严重的库排序原语将被切换对于小的子问题。

答案 1 :(得分:1)

这种类似于选择排序,因为每次通过外部循环都会识别最佳元素并将其从进一步考虑中移除。但是,在传统的选择排序中,最佳元素与要删除的元素交换,其他元素保持不变。在您列出的排序中(找到,IIRC,在“基本方法到其他地方”中),其他一些元素也会被交换。我认为额外的掉期没有完成任何特别有用的东西,并且这种排序几乎没有泡泡排序的唯一优势(适合在纯顺序访问媒体上实现)

答案 2 :(得分:0)

算法看起来更像是插入排序给我,因为它们共享相同(外部)循环不变量 - 在外部循环的j次迭代之后,j最小元素在它们的正确的位置。

另一方面,冒泡排序的特性是它总是交换相邻元素(在你的代码片段中不满足的属性)。

此算法的时间复杂度为O(n^2),就像冒泡排序和插入排序(在最坏的情况下快速排序)。

答案 3 :(得分:0)

对我来说,它看起来像Selection Sort。该算法的工作原理如下(如维基页面所述):

  1. 在列表中找到最小值
  2. 将其与第一个位置的值交换
  3. 对列表的其余部分重复上述步骤(从第二个位置开始并每次前进)