準備考研的過程當中,複習數據結構和算法時先看的是嚴蔚敏老師的《數據結構》,這本書雖然好可是對時間複雜度和算法的漸進性講解太少,讀完以後對其依然沒有深入的理解,因而開始啃《算法導論》,不得不說這本書很難啃,可是確實啃清楚了算法的時間複雜度和漸進性。這篇博客我會用到初中程度的代數知識來幫助你們完全理解。算法
我選擇插入排序做爲例子由於這個算法的思路足夠簡單,能夠很容易的分析出最好狀況和最壞狀況。咱們先來看一下插入排序的僞代碼,我使用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次