【问题标题】:Time complexity of two different solution for Bubble Sort冒泡排序的两种不同解决方案的时间复杂度
【发布时间】:2019-11-28 02:20:21
【问题描述】:

我通过两种方式为冒泡排序提出了解决方案。 一是每次都从头到尾检查。另一个也在从头到尾检查,但“结束”越来越小(-1)。因为我们可以保证在每个循环结束时对最后一个进行排序。

在我看来,第一个的时间复杂度是O(n^2),另一个是O(nlogn)。对吗?

第一

var bubbleSort = function(array) {
    // Your code here.

    let changed = true;
    let temp;
    while(changed){
      changed = false
      for(let i=0 ; i<array.length-1 ; i++){
        if(array[i] > array[i+1]){
          temp = array[i+1];
          array[i+1] = array[i];
          array[i] = temp;
          changed = true;
        }
      }
    }
    return array;

};

var bubbleSort = function(array) {
    // Your code here.
    let temp;

    for(let i=0 ; i<array.length-1 ; i++){
      for(let j=0 ; j<array.length-1-i ; j++){
        if(array[j]>array[j+1]){
          temp = array[j+1];
          array[j+1] = array[j];
          array[j] = temp;
        }
      }
    }
    return array;
};

【问题讨论】:

  • 不,都是 O(n^2)
  • 只有第一个算法是冒泡排序。第二个是选择排序的变体。内部循环处理数组中越来越小的未排序分区。它将最高的项目移动到未排序分区顶部的末尾,然后移动分区栅栏,以便该项目现在位于已排序的分区中。
  • 好吧,我们可以将第二个函数称为“气泡味(泡腾?)选择排序”。它通过交换选择最高的项目,这会导致其他项目冒泡靠近未排序数组的顶部。规范选择排序使用某种“查找最大值”功能来找到要删除并放入排序序列的最高项目。 IE。选择排序通常不是交换排序,但在这里它变成了交换排序。

标签: algorithm bubble-sort


【解决方案1】:

两种版本的冒泡排序在最坏情况下和平均情况下都是 O(n²)。

第一个版本,我称之为“朴素冒泡排序”,有一个外循环和一个内循环。内循环迭代 n-1 次,外循环也最多迭代 n-1 次。这一事实可以被证明是第二个版本(外部循环仅限于 n-1 次迭代)是正确的事实的推论。所以最坏情况的迭代次数是 (n-1) * (n-1) = O(n²)。它的最佳情况运行时间是 O(n),但这种情况很少发生,平均值仍然是 O(n²)。

第二个版本,通常称为“冒泡排序”,有一个迭代 n-1 次的外循环和一个迭代 n-1-i 次的内循环。由于 i 平均约为 n/2,因此迭代次数约为 n * n/2 = O(n²)。没有短路,因此这是该版本算法的最佳、最差和平均情况。

由于冒泡排序算法的一个基本事实,这两种算法的平均情况是 O(n²):它在输入数组中的每个 inversion 执行一次交换。反转是一对索引,其元素是无序的。总共有 (n choose 2) = n * (n-1) / 2 对,平均有一半是反转。要看到这一点,请考虑如果一个数组有 k 个反转,那么该数组的反转有 (n 选择 2) - k 个反转。因此,任一版本的冒泡排序平均执行 n * (n-1) / 4 次交换,即 O(n²)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多