算法相關(guān)GitHub持續(xù)更新,歡迎打臉~
算法是從事程序開(kāi)發(fā)人員永遠(yuǎn)繞不過(guò)去的一道門。雖然很多時(shí)候我們都會(huì)說(shuō),算法這東西只有面試時(shí)會(huì)用。但很多時(shí)候,算法已經(jīng)被潛移默化的影響著我們,影響著我們寫程序的方式。不知你有沒(méi)有這樣的經(jīng)歷,自己辛辛苦苦寫了幾百行代碼,終于將要實(shí)現(xiàn)的功能實(shí)現(xiàn)了,正怡然自得之時(shí),發(fā)現(xiàn)別人實(shí)現(xiàn)這個(gè)只用了一兩行代碼......</br>
總之,不管你學(xué)與不學(xué),算法就在那里!
不管你屑與不屑,面試官的考題就在那里!
既然這是個(gè)裝逼利器,既然是它總在無(wú)形中改變著什么,既然我們還有時(shí)間去征服,為什么不試試呢?</br>
大學(xué)時(shí)只是形式的學(xué),為了一個(gè)分?jǐn)?shù),認(rèn)為多一分浪費(fèi);現(xiàn)在想想人總是那么厚顏無(wú)恥,叫你學(xué)時(shí)不學(xué),沒(méi)人管了之后卻又想著把失去的補(bǔ)回來(lái),多說(shuō)無(wú)益,開(kāi)始鞭策自己,權(quán)當(dāng)從零開(kāi)始。</br>
排序是《數(shù)據(jù)結(jié)構(gòu)》里一個(gè)重要的一脈,從我們?nèi)粘5臉I(yè)務(wù)處理到數(shù)據(jù)庫(kù)的排序,都有對(duì)排序算法應(yīng)用的淋漓盡致,接下來(lái)的幾個(gè)星期,征服排序算法!</br>
知己知彼,百戰(zhàn)不殆
我們先回顧一下幾種常見(jiàn)的常用算法,從不同的維度比較各個(gè)算法的優(yōu)劣。</br>
時(shí)間復(fù)雜度
計(jì)算機(jī)科學(xué)中,算法的時(shí)間復(fù)雜度是一個(gè)函數(shù),它定量描述了該算法的運(yùn)行時(shí)間。這是一個(gè)關(guān)于代表算法輸入值的字符串的長(zhǎng)度的函數(shù)。時(shí)間復(fù)雜度常用大O符號(hào)表述,不包括這個(gè)函數(shù)的低階項(xiàng)和首項(xiàng)系數(shù)。使用這種方式時(shí),時(shí)間復(fù)雜度可被稱為是漸近的,它考察當(dāng)輸入值大小趨近無(wú)窮時(shí)的情況。</br>
空間復(fù)雜度
空間復(fù)雜度(Space Complexity)是對(duì)一個(gè)算法在運(yùn)行過(guò)程中臨時(shí)占用存儲(chǔ)空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序的時(shí)間復(fù)雜度是O(n^2),空間復(fù)雜度是O(1) 。而一般的遞歸算法就要有O(n)的空間復(fù)雜度了,因?yàn)槊看芜f歸都要存儲(chǔ)返回信息。一個(gè)算法的優(yōu)劣主要從算法的執(zhí)行時(shí)間和所需要占用的存儲(chǔ)空間兩個(gè)方面衡量。
| 排序法 | 最差時(shí)間分析 | 平均時(shí)間復(fù)雜度 | 穩(wěn)定度 | 空間復(fù)雜度 | 類型 |
|---|---|---|---|---|---|
| 冒泡排序 | O(n2) | O(n2) | 穩(wěn)定 | O(1) | 交換 |
| 快速排序 | O(n2) | O(n log2n) | 不穩(wěn)定 | O(log2n)~O(n) | 交換 |
| 選擇排序 | O(n2) | O(n2 ) | 穩(wěn)定 | O(1) | 選擇 |
| 堆排序 | O(n log2n) | O(n log2n) | 不穩(wěn)定 | O(1) | 選擇 |
| 插入排序 | O(n2) | O(n2) | 穩(wěn)定 | O(1) | 插入 |
| 希爾排序 | O(n) | O(n2) | 不穩(wěn)定 | O(1) | 插入 |
| 歸并排序 | O(n log2n) | O(n log2n) | 穩(wěn)定 | O(n) | 其他 |
| 基數(shù)/桶排序 | O(d*(r+n)) | O(d*(r+n)) | 穩(wěn)定 | O(rd+n) | 分配 |
| 二叉樹(shù)排序 | O(n2) | O(n log2n) | 不一定 | O(n) | 其他 |
<i>@author Swift</i>
<i>@date 2017-1-8</i>