经典排序算法之归并排序

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));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值