一、分治法
將乙個規模較大的問題轉化為多個相同形式小規模的子問題,子問題規模較小時,可自然求解。
子問題的解可通過合併得到原問題的解。
舉例:小明讓小張和小李去借2000元,小張借1000,小李借1000,他們各自向朋友去借,這就是乙個分治問題
思路:用兩個指標將陣列劃分為三個區間。
掃瞄指標左邊是確認小於等於主元的。
掃瞄指標右邊是確認大於主元的
一遍單向掃瞄法:選定第乙個陣列元素為主元,以它為基準,左指標開始從左邊挨個掃瞄,若掃瞄到的元素比主元小或相等,則保持位置不變,若掃瞄到的元素比主元大,此時這個元素與右指標所指元素交換
交換之後右指標向左移動
右指標若遇到比主元大的元素,該元素保持原位置不動,右指標繼續左移,若掃瞄到的元素比主元小,則和左指標所指位置元素交換。
重複以上步驟,直到左右指標相遇。
偽**
偽**
quicksort
quicksort
(a,p,r)
if(p
q=partition
(a,p,r)
quicksort
(a,p,q-1)
quicksort
(a,q+
1,r)
partition
(a,p,r)
pivot=a[p]
; sp=p+1;
//sp為掃瞄指標;左指標p向右移動
bigger=r //最右邊元素
while
(sp<=bigger);if
(a[sp]
<=pivot)
//掃瞄指標小於主元
sp++
//指標右移
else
swap
(a,sp,bigger)
//否則交換指標所指元素
bigger--
swap
(a,p,bigger)
return bigger
**
public
class
util
private
static
void
print
(int
arr)
private
static
int[
]getrandomarr
(int i,
int j,
int k)
public
static
intquicksort
(int a,
int p,
int r)
}public
static
intpartition
(int a,
int p,
int r)
分治法例項(快排)
分治法的精髓 分 將問題分解為規模更小的子問題 治 將這些規模更小的子問題逐個擊破 合 將已解決的子問題合併,最終得出 母 問題的解 快速排序原理 從一組數中選出乙個pivot 中心軸 將大於它的數放右邊,小於它的數放左邊,然後再從左邊和右邊的倆組數中分別執行此操作,此時,陣列就是有序的了。crea...
分治法 整數劃分問題
問題 將給定正整數n表示成一系列正整數之和n n1 n2 nk,其中n1 n2 nk 1,k 1。求正整數n的不同劃分個數p n 有些問題本身都具有比較明顯的遞迴關係,因而容易用遞迴函式直接求解。而有些問題遞迴關係卻不明顯。在本例中,如果設p n 為正整數n的劃分數,則難以找到遞迴關係,因此考慮增加...
整數劃分 分治法
整數劃分經典演算法了,不做解釋,自己做了一下,鍛鍊遞迴能力!1 include 2 3int bufferarray 1000 快取陣列 4int bufferlenth 0 快取陣列的當前長度 5int outputsignal 1 當前輸出的控制訊號 6int total 0 劃分的總數 78 ...