最近從頭開始學習演算法導論,作為乙個非計算機專業的學生,我的目的也就是為了找工作的時候能多點籌碼;但是學習過程中還是有不少收穫的,順便也能練習下python程式設計水平,因此記錄下學習內容
第一章是演算法基礎,這裡介紹了2種排序方法:插入排序和歸併排序;例子還算比較淺顯易懂。
對於插入排序,可以用乙個打牌時接牌的模型來比喻:起初手裡沒有牌,然後拿到第一張,肯定不需要排序,接著拿到第二張,將其與第一章比較大小,如果小,就放第一張左邊。接下去第三張,要與前2張進行比較,並插入合適的位置。
第二種是很簡單常見的氣泡排序。**如下:
第二種是比以上2者都快的歸併排序;**如下:
稍後將給上演算法原理及**詳解
對於歸併排序,首先我們假設有2堆已經排序好的陣列(紙牌)。那麼我們得想個辦法將其合併為乙個順序牌。首先將2堆牌正面放置,即每一堆都是上小下大排列。然後比較2張頂牌,取出一張小的,再比較頂牌,。。。直到有一堆牌被完全取光,那麼剩下的另一堆肯定都比現有的牌大,而且他也是排序好的,只要將其全部拿過來放在後面即可。
這就是2個有序陣列的合併過程。用merge(a,b)函式來表示這個過程
接下去就是二分遞迴策略,我們把待排序陣列分成2份,這2份再各自分為2份。。。直到分成的陣列中都只包含乙個元素,如果這2份有序(顯然是有序的,因為只有乙個數啊),那麼可以呼叫merge將其合併為乙個。這樣遞迴呼叫,如merge-sort所示。
小於10個則採用插入排序,這個是書上的練習題,不是原始歸併排序的步驟。總結以下,在遞迴呼叫中要注意的幾點:
1、分解到最底層時候的操作,如len(a)==1時,往往要單獨拿出來操作,否則會無限遞迴下去
2、相同的操作可以使用遞迴,不同的操作則要單獨寫成乙個函式,如這裡的merge必須得單寫乙個
個人學習《演算法導論》筆記 演算法基礎(1)插入排序
插入排序在我們生活中很常見,比如玩撲克牌,左手拿牌,右手取排。從第1張牌開始,左手的撲克牌按照大小順序對號入座,構成乙個暫時的有序陣列a。這時,右手從桌子上取到的一張牌,相當於陣列的乙個元素,記作b。桌子上還未取的牌組成了乙個無序陣列c。我們可以把 a,b,c 看作乙個整體的陣列m,那麼問題轉換為常...
演算法導論 排序演算法學習(1)
插入排序有點類似於我們打牌時整理手牌的過程,以左手拿牌,右手起牌為例。左手上面的牌,總是按照從小到大 從大到小 的順序排列,而右手拿上來的牌則根據大小在左手選擇位置插入,從而依舊保證了左手手牌依然是有序的。void insertsort int array,int length array j 1 ...
演算法導論學習筆記 (1)
乙個acm若菜,趁著acm淡季,開始學習演算法導論了,經過一年的acm學習,逐漸的發現,學東西,深入才是王道,以前學習乙個演算法,總是看懂了就開始做題,到後來才發現很多題目,會演算法,卻不知道是用這個演算法,這就是演算法理解的不到位的後果,從今天開始,定下目標 1.深入系統的學習演算法,2.學會紙上...