merge_sort(A, n) {
merge_sort_c(A, 0, n-1)
}
merge_sort_c(A, p, r) {
if p >= r then return
q = (p+r) / 2
merge_sort_c(A, p, q)
merge_sort_c(A, q+1, r)
merge(A[p...r], A[p...q], A[q+1...r])
}
merge(A[p...r], A[p...q], A[q+1...r]) {
var i := p,j := q+1,k := 0
var tmp := new array[0...r-p]
while i<=q AND j<=r do {
if A[i] <= A[j] {
tmp[k++] = A[i++]
} else {
tmp[k++] = A[j++]
}
}
var start := i,end := q
if j<=r then start := j, end:=r
while start <= end do {
tmp[k++] = A[start++]
}
for i:=0 to r-p do {
A[p+i] = tmp[i]
}
}
注:merge()合并函数如果借助哨兵代码就会简洁很多