一、快速排序quicksort
快速排序和歸併排序都使用分治法來設計演算法,區別在於歸併排序把陣列分為兩個基本等長的子陣列,分別排好序之後還要進行歸併(merge)操作,而快速排序拆分子陣列的時候顯得更有藝術,取乙個基準元素,拆分之後基準元素左邊的元素都比基準元素小,右邊的元素都不小於基準元素,這樣只需要分別對兩個子陣列排序即可,不再像歸併排序一樣需要歸併操作。
二、深度優先 與 廣度優先
1.概念
廣度優先搜尋(bfs),可以被形象的描述為「淺嘗輒止」,具體一點就是每個頂點只訪問它的鄰接節點(如果它的鄰接節點沒有被訪問)並且記錄這個鄰接節點,當訪問完它的鄰接節點之後就結束這個頂點的訪問。
廣度優先用到了「先進先出」佇列,通過這個佇列來儲存第一次發現的節點,以便下一次的處理;而對於再次發現的節點,我們不予理會——不放入佇列,因為再次發現的節點:
無非是已經處理完的了;
或者是儲存在佇列中尚未處理的;
深度優先搜尋(dfs),可以被形象的描述為「打破沙鍋問到底」,具體一點就是訪問乙個頂點之後,我繼而訪問它的下乙個鄰接的頂點,如此往復,直到當前頂點一被訪問或者它不存在鄰接的頂點。
2.通俗理解
相當於在漆黑的夜裡,你只能看清你站的位置和你前面的路,但你不知道每條路能夠通向**。
搜尋的任務就是,給出初始位置和目標位置,要求找到一條到達目標的路徑。
深度優先就是,從初始點出發,不斷向前走,如果碰到死路了,就往回走一步,嘗試另一條路,直到發現了目標位置。這種不撞南牆不回頭的方法,即使成功也不一定找到一條好路,但好處是需要記住的位置比較少。
廣度優先就是,從初始點出發,把所有可能的路徑都走一遍,如果裡面沒有目標位置,則嘗試把所有兩步能夠到的位置都走一遍,看有沒有目標位置;如果還不行,則嘗試所有三步可以到的位置。這種方法,一定可以找到一條最短路徑,但需要記憶的內容實在很多,要量力而行。
3.總結
兩個演算法都是o(v+e),在用到的時候適當選取。在使用白灰黑標誌的時候,突然明白了如何用深度優先搜尋來判斷有向圖中是否存在環。
深度優先和廣度優先各有各的優缺點:
在更多的情況下,深優是比較好的方案。
三、迪傑斯特拉
戴克斯特拉演算法(dijkstra』s algorithm)是由荷蘭計算機科學家艾茲赫爾·戴克斯特拉提出。
迪科斯徹演算法使用了廣度優先搜尋解決非負權有向圖的單源最短路徑問題(其實也可以使用深度優先搜尋),演算法最終得到乙個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的乙個子模組。
該演算法的輸入包含了乙個有權重的有向圖 g,以及g中的乙個**頂點 s。我們以 v 表示 g 中所有頂點的集合。每乙個圖中的邊,都是兩個頂點所形成的有序元素對。(u, v) 表示從頂點 u 到 v 有路徑相連。我們以 e 表示g中所有邊的集合,而邊的權重則由權重函式 w: e → [0, ∞] 定義。因此,w(u, v) 就是從頂點 u 到頂點 v 的非負權重(weight)。邊的權重可以想像成兩個頂點之間的距離。任兩點間路徑的權重,就是該路徑上所有邊的權重總和。已知有 v 中有頂點 s 及 t,dijkstra 演算法可以找到 s 到 t的最低權重路徑(例如,最短路徑)。這個演算法也可以在乙個圖中,找到從乙個頂點 s 到任何其他頂點的最短路徑。對於不含負權的有向圖,dijkstra演算法是目前已知的最快的單源最短路徑演算法。
四、動態規劃演算法
常用排序演算法
筆者最近學習演算法,學了很久也只弄懂了幾個排序演算法,在這裡曬一下下,作為以後參考之用。一 為什麼要研究排序問題 許多計算機科學家認為,排序演算法是演算法學習中最基本的問題,原因有以下幾點 l有時候應用程式本身需要對資訊進行排序,如為了準備客戶賬目,銀行需要對支票賬號進行排序 l很多演算法將排序作為...
常用排序演算法
一 簡單排序演算法 由於程式比較簡單,所以沒有加什麼注釋。所有的程式都給出了完整的執行 並在我的vc環境 下執行通過。因為沒有涉及mfc和windows的內容,所以在borland c 的平台上應該也不會有什麼 問題的。在 的後面給出了執行過程示意,希望對理解有幫助。1.冒泡法 這是最原始,也是眾所...
常用排序演算法
排序演算法 最好時間 平均時間 最壞時間 輔助空間 穩定性 直接插入排序 o n o n 2 o n 2 o 1 穩定 希爾排序 o n 1.3 o 1 不穩定 直接選擇排序 o n 2 o n 2 o n 2 o 1 不穩定 堆排序 o n x lbn o n x lbn o n x lbn o ...