python实现:
'''
// 归并排序算法, A是数组,n表示数组大小
merge_sort(A, n) {
merge_sort_c(A, 0, n-1)
}
// 递归调用函数
merge_sort_c(A, p, r) {
// 递归终止条件
if p >= r then return
// 取p到r之间的中间位置q
q = (p+r) / 2
// 分治递归
merge_sort_c(A, p, q)
merge_sort_c(A, q+1, r)
// 将A[p...q]和A[q+1...r]合并为A[p...r]
merge(A[p...r], A[p...q], A[q+1...r])
}
'''
# 归并排序
def merge_sort(arr: List[int]):
merger_sort_c(arr, 0, len(arr) - 1)
def merger_sort_c(arr: List[int], low: int, high: int):
if low >= high:
return
mid = (low + high) // 2
# mid = low + (high - low) // 2
merger_sort_c(arr, low, mid)
merger_sort_c(arr, mid + 1, high)
merger(arr, low, mid, high)
def merger(arr, low, mid, high):
# arr[low:mid], arr[mid+1, high] are sorted.
i, j = low, mid + 1
tmp = []
while i <= mid and j <= high:
if arr[i] <= arr[j]:
tmp.append(arr[i])
i += 1
else:
tmp.append(arr[j])
j += 1
start = i if i <= mid else j
end = mid if i <= mid else high
tmp.extend(arr[start: end+1])
arr[low: high+1] = tmp
js实现
// 归并排序 递归法,
// 注意这里返回的才是排好序的数组,原数组没有变动
function _merge(left, right){
// 创建大小为left + right 大小的数组
let result = [];
while(left.length > 0 && right.length > 0){
if (left[0] < right[0]){
result.push(left.shift());
} else{
result.push(right.shift());
}
}
return result.concat(left, right);
}
function mergeSort(arr){
if (arr.length <= 1) return arr;
let mid = arr.length >> 1;
let left = arr.slice(0, mid);
let right = arr.slice(mid);
return _merge(mergeSort(left), mergeSort(right));
}