分治法 快排劃分法(單向掃瞄法)

2021-10-03 00:04:34 字數 1892 閱讀 1499

一、分治法

將乙個規模較大的問題轉化為多個相同形式小規模的子問題,子問題規模較小時,可自然求解。

子問題的解可通過合併得到原問題的解。

舉例:小明讓小張和小李去借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 ...