算法課最頭疼的就是什麽遞歸叠代、分治、排序這些魑魅魍魎。以致於寫推薦信找算法老師被問算法課考了多少分都羞於啟齒。畢竟人家不識妳,憑什麽給妳簽那個名字,而相反自己卻只是壹時興起,想著難度較大專業性強的算法課的老師的推薦信要靠譜些,實際上後來發現這只是無知惹的惑。靠不靠譜,還是要靠發論文的質量和數量及學界影響,當然在「學渣」的世界中攀不起院長,做不了項目實習生,所以必須曲線突圍。好在這個世界不止有一條路,如今卻又回到原點。補補當時落下的課目。
不就是數大數小的排序麼,小學就會了,只不過爲了計算的方便,非得搞出來那麼多名堂倒把人嚇退了,還要寫出來算法,計算其時間複雜性如此種種。其時算法主要是思路,有了思路,還怕寫不出程序。那我們就一一看來。
輸入是一個數組,裏面的數雜七雜八,算法的目的要把他們排成有序的數列。
直接排序(即插入排序,insertion sort)好比整理手中的撲克牌。第一張牌在手,已然有序,第二張抓上來的牌放在合適的位置,以後每次抓上來一張牌都插在合適的位置,這樣每時每刻都是有序的,直到牌抓完序也擺好。這些牌在手裏插起來很方便,只需「露開一個空檔」。但對於數組,這樣需要做的移動會比較多。
直接排序的最佳情形,就好比抓到的牌的順序是A23456789JQK
。這樣初始有序,直接排序就省去插入環節,比較次數爲n(1+n)/2
。
二分插入排序 (binary sort)規避直接插入的盲目尋找,從中間一分爲二,第i
個元素先跟前i-1
個元素的中間元素比,小的話,就再同(i-1)/2
個元素的中間元素比,直到找到合適的插入位置。
冒泡排序 (bubble sort)解決的是每次插入帶來的數組內移動的開銷。想法相對簡單,每次比較兩個元素,如果排序錯誤,就互相交換,直到沒有交換發生爲止。
快速排序 (quick sort)對冒泡有所改進,兵分兩路(i=0
, j=n-1
),把首數(a[0]
)作爲關鍵數,從尾部倒着找比它小的,最先找到的比它小的跟數組第i
個(此時i=0
)交換,再從頭部順着找比它大的,最先找到的跟第j
個交換,然後j--
, i++
,重複此步驟直到i=j
。上述是一趟排序,並不能確保這樣就排好序,需要將整個過程重複(即很多趟这样的排序)直到沒有交換發生爲止。這裏面的想法是把整個數組始終分成大數一組和小數一組,然後通過不斷比較將小數排好,大數排好。