以插入排序爲例子帶你完全理解算法中的時間複雜度和各類漸進符號

  準備考研的過程當中,複習數據結構和算法時先看的是嚴蔚敏老師的《數據結構》,這本書雖然好可是對時間複雜度和算法的漸進性講解太少,讀完以後對其依然沒有深入的理解,因而開始啃《算法導論》,不得不說這本書很難啃,可是確實啃清楚了算法的時間複雜度和漸進性。這篇博客我會用到初中程度的代數知識來幫助你們完全理解。算法

  我選擇插入排序做爲例子由於這個算法的思路足夠簡單,能夠很容易的分析出最好狀況和最壞狀況。咱們先來看一下插入排序的僞代碼,我使用C++來書寫代碼,有註釋:數組

//插入排序的算法思路很簡單,聯想打撲克牌時理順手中牌的時候,你從左往右依次檢查你的牌,並將其和前面的牌進行比較,而後將其插入正確的位置
void insertion_sort(int arr[],int length){                                        
    int key;//key做爲當前你所檢查的這張牌,爲了方便表達咱們稱之爲 關鍵牌      
    for(int i=1;i<length;i++){//從第二張牌開始,一直迭代到最後一張牌
        key = arr[i];//將本次須要排序的牌拿出,做爲關鍵牌
        int j = i-1;//從關鍵牌的前一張開始往前檢查,對比大小
 
        //當被對比的牌比關鍵牌大時,關鍵牌前面全部的牌都比關鍵牌大時,把牌日後挪動一個位置
        while(j>-1 && arr[j] > key){
            arr[j+1] = arr[j];
            j--;
        }
 
        arr[j+1] = key;//將關鍵插入正確的位置
    }
 }

那麼咱們該如何知道,這段代碼在實際執行時所花費的時間呢?固然能夠上機測試,可是那樣是經驗論者和低端玩家乾的事情,這裏咱們須要一些簡單的數學知識和邏輯分析就能算出運行時間,咱們假設,此次共排序一個長度爲n的數組,那麼每句代碼執行所須要的時間代價和執行次數能夠用下表表示:數據結構

代碼                  時間代價                執行次數數據結構和算法

int key                          c1                    1次
int i=1;i<length;i++        c2                    n次
key = arr[i]             c3                    n-1次
int j = i-1             c4                    n-1次

while(j>-1 && arr[j] > key)   c5   這裏咱們沒法判斷具體的執行次數,可是知道外層循環要執行n-1次,假設第i次循環中這裏執行k(i)次,那麼共執行k(1)+k(2)+...+k(n-1)次
arr[j+1] = arr[j]         c6           循環內的語句總比循環數少1,因而共執行(k(1)-1)+(k(2)-1)+...+(k(n-1)-1)次
j--;                 c7           同理,共執行(k(1)-1)+(k(2)-1)+...+(k(n-1)-1)次
arr[j+1] = key           c8            n-1次

 

 

 

相關文章
相關標籤/搜索