1. 程式人生 > >算法導論-第二章-算法基礎(速記)

算法導論-第二章-算法基礎(速記)

link 通過 序列 key ott 計算 p s 歸並 清晰

偽代碼與真碼的區別在於,在偽代碼中,我們使用最清晰,最簡潔的表示方式來說明給定的算法.偽代碼與真碼的另一個區別是偽代碼通常不關心軟件工程的問題.

插入排序INSERTION-SORT,參數是一個數組A[1..n],包含長度為n的要排序的一個序列.

該算法原址排序輸入的數:算法在數組A中重排這些數,在任何時候,最多只有其中的常數個數字存儲在數組外面.

  INSERTION-SORT(A)
1     for j = 2 to A.length
2         key = A[j]
4         i = j-1
5         while i > 0 and A[i] > key
6 A[i+1] = A[i] 7 i = i-1 8 A[i+1] = key

如果一個算法的最壞情況運行時間具有比另一個算法更低的增長量級,那麽我們通常認為前者比後者更有效.

分治模型在每層遞歸時都有三個步驟:

分解原問題為若幹子問題,這些子問題是原問題的規模較小的實例.

解決這些子問題,遞歸地求解各子問題.然而,若子問題的規模足夠小,則直接求解.

合並這些子問題的解成原問題的解.

歸並排序算法完全遵循分治模式.

分解: 分解待排序的n個元素的序列成各具n/2個元素的兩個子序列.

解決: 使用歸並排序遞歸地排序兩個子序列.

合並: 合並兩個已排序的子序列以產生已排序的答案.

我們通過一個輔助過程MERGE(A, p, q, r)來完成合並,其中A是一個數組,p,q和r是數組下標,滿足p≤q<r.

該過程假設子數組A[p..q]和A[q+1..r]都已排好序.它合並這兩個子數組形成單一的已排好序的子數組並代替當前的子數組A[p..r].

在每個堆的底部放置一張哨兵牌.

   MERGE(A, p, q, r)
 1    n
1
 = q - p + 1
 2    n
2
 = r - q
 3    let L[1..n
1
+1] and R[1..n
2
+1] be new arrays
 
4    for i = 1 to n1 5      L[i] = A[p + i -1] 6    for j = 1 to n2 7      R[j] = A[q + j] 8    L[n
1
 + 1] =9    L[n
2
 + 1] =10   i = 1
11   j = 1
12   for k = p to r
13     if L[i] ≤ R[j]
14       A[k] = L[i]
15       i = i + 1
16     else A[k] = R[j]
17       j = j + 1

現在我們可以把過程MERGE作為歸並排序算法的一個子程序來用.

MERGE-SORT(A, p, r)排序子數組A[p..r]中的元素.若p≥r,則該子數組最多有一個元素,所以已經排好序.

否則,分解步驟簡單地計算一個下標q,將A[p..r]分成兩個子數組A[p..q]和A[q+1..r],前者包含?n/2?個元素,後者包含?n/2?個元素

  MERGE-SORT(A, p, r)
1     if p < r
2         q = (p+r)/2
3         MERGE-SORT(A, p, q)
4         MERGE-SORT(A, q+1, r)
5         MERGE(A, p, q, r)

算法導論-第二章-算法基礎(速記)