程序員:最快排序和搜索算法最簡(jiǎn)代碼實(shí)現(xiàn)
算法的核心問(wèn)題是排序和搜索。這2個(gè)領(lǐng)域應(yīng)用最廣,研究也最透。本文我將講解排序和搜索領(lǐng)域最高效的兩個(gè)算法:快速排序算法和二分搜索算法。
教科書和很多實(shí)現(xiàn)庫(kù)給出的這兩個(gè)算法的代碼非常復(fù)雜,很難理解,本文中給出的代碼是最簡(jiǎn)單的實(shí)現(xiàn)代碼,易于理解,效率也很高。
二分搜索算法是在我用Flex開(kāi)發(fā)工作流編輯器時(shí)實(shí)現(xiàn)的。當(dāng)時(shí)的需求是在2個(gè)圖形之間畫出連接線,要求根據(jù)鼠標(biāo)操作來(lái)繪制,并且線段的起點(diǎn)和終點(diǎn)都是在圖形的外框上。
上面的描述可能比較抽象,這么說(shuō)吧,原來(lái)我實(shí)現(xiàn)的GUI效果是,2個(gè)方框,使用鼠標(biāo)把它們連接起來(lái),我繪制的線是鼠標(biāo)點(diǎn)下和釋放這2個(gè)端點(diǎn)連接起來(lái)的線段。但是,這樣的線段比較丑,客戶要求線段的兩頭應(yīng)該在2個(gè)方框的邊框上。
怎么解決這個(gè)問(wèn)題呢?我把線段看做是排序后的點(diǎn)的集合,然后就可以使用二分搜索算法搜索到線段和邊框的交點(diǎn),然后把它們繪制出來(lái)。
當(dāng)時(shí)的二分搜索算法是用ActionScript3寫的,現(xiàn)在我把它改成Java了。
快速排序算法和二分搜索算法
算法主要分為排序算法、搜索算法、圖算法。圖算法我用得不多,沒(méi)有發(fā)言權(quán),本文就不說(shuō)了。
排序算法中最快的是快速排序算法,搜索算法中最快的是二分搜索算法。我也最喜歡這2個(gè)算法。
因?yàn),它們是使用遞歸實(shí)現(xiàn)的,代碼簡(jiǎn)潔清晰,效率又非常高。
根據(jù)我的理解,算法的本質(zhì)就是數(shù)學(xué)。根據(jù)輸入和設(shè)定的目標(biāo),采用有限的步驟實(shí)現(xiàn)輸出。通常,使用計(jì)算機(jī)實(shí)現(xiàn)的算法,都會(huì)用到循環(huán),這樣才能發(fā)揮計(jì)算機(jī)高速運(yùn)算的優(yōu)勢(shì)。
循環(huán)和遞歸是等效的,這已經(jīng)被科學(xué)家所證明。數(shù)學(xué)上沒(méi)有循環(huán),只有遞歸的概念,因此使用遞歸代替循環(huán)表示算法有很多好處:
1, 遞歸的代碼要比循環(huán)簡(jiǎn)潔很多,也優(yōu)雅很多。
2, 遞歸的代碼可以用數(shù)學(xué)方式建模,可以從數(shù)學(xué)角度驗(yàn)證其正確性。
很多函數(shù)式語(yǔ)言甚至沒(méi)有循環(huán)的概念和關(guān)鍵字,強(qiáng)迫你使用遞歸來(lái)實(shí)現(xiàn)循環(huán)。如,ErLang。
但是,遞歸算法會(huì)容易轉(zhuǎn)變?yōu)檠h(huán)。我更欣賞遞歸的簡(jiǎn)潔,除非真的出現(xiàn)棧溢出的問(wèn)題,我是不會(huì)使用循環(huán)的.
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |