合併排序多執行緒
A 是陣列和陣列的 p 和 q 索引,例如你要對子陣列 A [p..r]進行排序。 B 是一個子陣列,將由排序填充。
對 p-merge-sort(A, p, r, B, s) 的呼叫對 A [p..r]中的元素進行排序,並將它們放入 B [s..s + rp]中。
p-merge-sort(A,p,r,B,s)
n = r-p+1
if n==1
B[s] = A[p]
else
T = new Array(n) //create a new array T of size n
q = floor((p+r)/2))
q_prime = q-p+1
spawn p-merge-sort(A,p,q,T,1)
p-merge-sort(A,q+1,r,T,q_prime+1)
sync
p-merge(T,1,q_prime,q_prime+1,n,B,s)
這是並行執行合併的輔助功能。
p-merge 假設要合併的兩個子陣列在同一個陣列中,但不假設它們在陣列中相鄰。這就是我們需要 p1,r1,p2,r2 的原因。
p-merge(T,p1,r1,p2,r2,A,p3)
n1 = r1-p1+1
n2 = r2-p2+1
if n1<n2 //check if n1>=n2
permute p1 and p2
permute r1 and r2
permute n1 and n2
if n1==0 //both empty?
return
else
q1 = floor((p1+r1)/2)
q2 = dichotomic-search(T[q1],T,p2,r2)
q3 = p3 + (q1-p1) + (q2-p2)
A[q3] = T[q1]
spawn p-merge(T,p1,q1-1,p2,q2-1,A,p3)
p-merge(T,q1+1,r1,q2,r2,A,q3+1)
sync
這裡是輔助功能 dichotomic-search。
x 是在子陣列 T [p..r]中尋找的關鍵。
dichotomic-search(x,T,p,r)
inf = p
sup = max(p,r+1)
while inf<sup
half = floor((inf+sup)/2)
if x<=T[half]
sup = half
else
inf = half+1
return sup