算法之排序和極值小結

排序:基礎的排序分爲三類:插入(直接插入、shell)、選擇(直接選擇、堆排序)、交換(冒泡、快速)。極值:動態規劃、貪心、回溯。

這裏涉及的內容很多,不是一篇博客能說清楚的,這裏宏觀上,對它們做個對比和總結。

1.1 插入排序

直接插入排序:對待排序的記錄逐個進行處理,每個新記錄與同組那些已經排好序的記錄進行比較,然後插入到適當的位置。如果按從小到大排序,對已經排好序的記錄按照從大到小的順序,依次與新紀錄進行比較,直到找到一個不大 於新紀錄的值,這就是新記錄應該插入的位置;依次把新紀錄插入到逐步擴大的已排序子序列中,直到最後完全排好序。

shell排序:Shell排序是對直接插入排序的優化。將帶排序序列分爲若干個子序列(即分組),要保證子序列中的記錄在原始數組中不相鄰,且間距相同,分別對這些子序列進行插入排序;然後減少記錄間的間距,減少小序列的個數,將原始序列分爲更大、更有序的子序列,分別進行插入排序;重複進行下去,直到最後間距減少爲1,然後對整個序列進行插入排序。


1.2 選擇排序

直接選擇排序:逐個找出第i小的記錄,並將整個記錄與數組的第i個位置的記錄交換,第i小的記錄一次交換到位。

堆排序:堆排對直接選擇排序的優化。對所有記錄建立最大堆,取出堆頂的最大記錄與數組末端的記錄交換,原數組末端元素臨時處於根節點;將剩下的n-1個記錄重新調整爲堆,再取新堆頂最大記錄,與第n-2的位置交換.......;不斷重複這一操作,直到堆爲空,得到從小到大排序的數組。


1.3 交換排序

冒泡排序:從數y末端開始,不斷比較相鄰記錄,不滿足排序要求就交換;第一輪冒泡過程,r0是最小的記錄,因此第二輪冒泡只需要對rn-1到r1進行比較。第二次冒泡完,次小的記錄,就被推到r1上。依次類推,直到數組中所有記錄都排好序爲止。

快速排序: 快速排序是對冒泡排序的優化。從待排序列中,任意選擇一個記錄k作爲軸值,將剩餘的記錄分割成左子序列L和右子序列R。L中所有記錄都小於或等於k,R中記錄都大於等於k,因此k正好位於正確的位置。對於序列L和R進行快速排序,直到子序列中只含有0或1個元素,退出遞歸。


2.1 動態規劃

動態規劃與分治法類似,將帶求解的問題分解成若干個子問題,先求解子問題,然後從子問題的解得到原問題的解。動態規劃法求解的問題,分解得到的子問題往往不是獨立的。動態規劃法通常用於求解具有某種最優性質的問題。動態規劃法求解可以分一下幾個步驟:

1) 找出最優解的性質,刻畫結構特徵

2) 遞歸的定義最優解的值

3) 以自底向上的方式計算出最優值

4) 根據計算最優值時得到的信息,構造一個最優解。

2.2 貪心

貪心法在解決問題的策略上是根據當前以後的信息作出選擇,而且一旦作出了選擇,不管將來有什麼結果,這個選擇都不會改變。所以,貪心法並不是從整體最優考慮,它的選擇某種意義上的局部最優。這種最優選擇並不能保證總能獲得全局最優解,但通常得到較好的近似最優解。


2.3 回溯

回溯法有“通用的解題法”之稱,用它可以系統的搜索一個問題的所有解,或任意一解。t它在包含問題的所有解的解空間樹中,按照深度優先的策略,從根節點出發搜索解空間樹。算法搜索到解空間樹的任一節點時,總是先判斷該節點是否肯定不包含問題的解。如果肯定不包含,則跳過對以該節點爲根的子樹的系統搜索,逐層向其祖先節點回溯;否則,進入該子樹,繼續按深度優先的策略搜索。回溯法在用來求問題的所有解時,要回溯到根,且節點的所有子樹都已被搜索遍才結束。而用來求問題的任一解時,只要搜索到問題的一個解就可以結束。


對比以上各算法的關係,簡單畫了如下思維導圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章