【问题标题】:What is the big O notation for this bubble sort?这种冒泡排序的大 O 表示法是什么?
【发布时间】:2021-12-28 17:28:46
【问题描述】:

这个冒泡排序是我的代码的一部分,它按升序对数组进行排序,并且我用它们之间的一个值交换值。我不知道这部分代码的大 O 表示法。如果我的数组的长度是n,是O(n)还是O(n^2)

public static int Sort(int[] b, int begin) {
    boolean swapped = false;
    int count1 = 0;
    int temporary;
    while (swapped == false) {
        swapped = true;
        for (int i = begin; i < b.length - 1; i+=2) {
            if (b[i] > b[i + 2]) {
                temporary = b[i];
                b[i] = b[i + 2];
                b[i + 2] = temporary;
                swapped = false;
                count1++;
            }
        }
    }
    return count1;
}

【问题讨论】:

  • 提示:两个循环,其中计算量是输入数组大小的函数

标签: java time-complexity big-o bubble-sort


【解决方案1】:

采取最坏的情况:数组严格递减。您的代码将执行内部 for 循环 O(n) 次,每次采用 O(n),导致总时间复杂度为 O(n^2)。一般来说,冒泡排序及其派生词是O(n^2)

提示:Java 有 Arrays.sort(),它对原语使用快速排序,对对象使用合并排序,两者的运行时 O(n log n) 都远优于 n^2

【讨论】:

  • 问题是我只能用一个数字交换数字。
  • 仍然是 O(n^2),原因与我的回复第一段中所述的相同
【解决方案2】:

粗略地说是O(N^2)。但这与真正的冒泡排序实现之间存在一些重要差异。

  1. 它只会从begin 开始对元素进行排序。
  2. 如果begin 是偶数,或者只会对偶数位置的元素进行排序。
  3. 如果begin 是奇数,或者只会对奇数位置的元素进行排序。

所以其实是partial排序,就是O(M^2),其中M就是b.length - begin

如果我们将begin设置为零,即O(N^2),但如果我们将begin设置为m.length - C,则为O(1)!!!

【讨论】: