time-complexity - 为什么冒泡排序的时间复杂度是 O(n)

标签 time-complexity bubble-sort

我根据书中使用的方法推导出了冒泡排序在最佳情况下的时间复杂度。算法 2.2.但结果是 O(n^2)。

这是我的推导,希望有人能帮我找出错误的地方:

public void bubbleSort(int arr[]) {
for(int i = 0, len = arr.length; i < len - 1; i++) {
    for(int j = 0; j < len - i - 1; j++) {
        if(arr[j + 1] < arr[j])
            swap(arr, j, j + 1);
    }
}

}
Statements                      cost    times
i = 0,len = arr.length          c1          1
i < len - 1                     c2          n
i++                             c3          n - 1
j = 0                           c4          n - 1
j < len - i - 1                 c5          t1(i=0) + t1(i=1) + ... + t1(i = n-2)
j++                             c6          t2(i=0) + t2(i=1) + ... + t2(i = n-2)
arr[j + 1] < arr[j]             c7          t3(i=0) + t3(i=1) + ... + t3(i = n-2)
swap(arr, j, j + 1)             c8          t4(i=0) + t4(i=1) + ... + t4(i = n-2)

T(n) = c1 + c2n + c3(n - 1) + c4(n - 1) + c5t5 + c6t6 + c7t7 + c8t8
= c1 + c2n + c3(n - 1) + c4(n - 1) + c5[t1(i=0) + t1(i=1) + ... + t1(i = n-2)] + c6 [t2(i=0) + t2(i=1) + ... + t2(i = n-2)] + c7[t3(i=0) + t3(i=1) + ... + t3 (i = n-2)] + c8[t4(i=0) + t4(i=1) + ... + t4(i = n-2)];

在最好的 Actor 阵容中,排序前序列已经是正数。那么t8应该是0。

T(n) = c1 + c2n + c3(n - 1) + c4(n - 1) + c5[t1(i=0) + t1(i=1) + ... + t1(i = n-2) )] + c6[t2(i=0) + t2(i=1) + ... + t2(i = n-2)] + c7[t3(i=0) + t3(i=1) + . .. + t3(i = n-2)]

时间复杂度为 O(n^2)

最佳答案

您的实现

public void bubbleSort(int arr[]) {
    for(int i = 0, len = arr.length; i < len - 1; i++) {
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j])
                swap(arr, j, j + 1);
        }
    }
}

缺乏控制内循环中是否有任何交换,如果没有,则无法控制外循环。

这种控制使得最好的情况(一个已经排序的数组)是 O(n) 成为可能,因为当它第一次运行时,内部循环中没有交换。
public void bubbleSort(int arr[]) {
    boolean swapped = true;
    for(int i = 0, len = arr.length; swapped && i < len - 1; i++) {
        swapped = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                swapped = true;
            }
        }
    }
}

关于time-complexity - 为什么冒泡排序的时间复杂度是 O(n),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12505832/

相关文章:

java - 算法的复杂性(嵌套循环)

algorithm - 将堆栈实现为数组的成本分析?

python - 查找两个字符串之间的公共(public)子字符串

java - Java vector 中的冒泡排序

c - 使用指针、数组和冒泡排序的数据排序程序存在语法错误

c++ - last-- 有什么用?这里?

algorithm - 为什么以下算法(循环排序?!)的时间复杂度是 O(n)?

algorithm - 冒泡排序算法 while 循环功能

c - 在冒泡排序中显示 2 个相同的值

algorithm - 如何根据增量值确定算法的时间复杂度