冒泡排序算法的最佳時間復雜度為啥為O(n)


 

轉載自:https://www.cnblogs.com/melon-h/archive/2012/09/20/2694941.html

侵刪,謹供自己參考。

 

 

我在許多書本上看到冒泡排序的最佳時間復雜度是O(n),即是在序列本來就是正序的情況下。

但我一直不明白這是怎么算出來的,因此通過閱讀《算法導論-第2版》的2.2節,使用對插入排序最佳時間復雜度推算的方法,來計算冒泡排序的復雜度。

1. 《算法導論》2.2中對插入排序最佳時間復雜度的推算

  在最好情況下,6和7總不被執行,5每次只被執行1次。因此,

  

  時間復雜度為O(n)

 

2. 冒泡排序的時間復雜度

  2.1 排序代碼

復制代碼
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);
        }
    }
}
復制代碼

  2.2 最佳情況

    序列原本就是正序

  2.3 最佳情況時間復雜度推算

語句 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 t(i=0) + t(i=1) + ... + t(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) + 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)]; 

  當序列原本就是正序時,8從不被執行。因此

  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)。

  可是網上和許多書上都寫道是O(n),不知是否有人能幫我解答一下呢?

  2.4 在Stackoverflow上問到答案了。

  我原本的代碼的時間復雜度確實應該是O(n^2),但算法可以改進,使最佳情況時為O(n)。改進后的代碼為:

復制代碼
public void bubbleSort(int arr[]) {
    boolean didSwap;
    for(int i = 0, len = arr.length; i < len - 1; i++) {
        didSwap = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                didSwap = true;
            }
        }
        if(didSwap == false)
            return;
    }    
}
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM