二路归并排序算法

二路归并排序算法简单理解就是两两进行比较,然后把他们合并到一起。 通俗理解就是去买衣服的时候,经常会货比三家,看了一个店选两件衣服,然后又去另外一个店选了同款的两件衣服。看价格排序,或者性价比排序 一下,看哪个更便宜,或者性价比更高。

 

二路归并排序关键点:

  1. 相邻的两两进行比较,然后把他们合并在一起。相邻的两两最开始是单个元素,合并之后就会翻倍。
  2. 二路归并排序的过程,需要先拆分元素,然后再合并。

二路归并排序是不稳定的排序,时间复杂度o(n^2), 空间复杂度o(n)

举一个例子看一下二路归并排序的过程:

以数组 5,3,2,1 为例子

  1. 先拆分数组, 分成两组,5,3 和 2,1
  2. 继续拆分,两组变成四组, 5,3,2,1各自都是一组
  3. 两两进行合并,合并成两组, 3,5和1,2
  4. 再两两合并,合并成一组, 1,2,3,5

 

看一下用python是如何实现的

def merge_list(elements, low, mid, high):
    tmp = [0] * (high - low + 1)
    index = 0
    left = low
    right = mid + 1
    while left <= mid and right <= high:
        if elements[left] < elements[right]:
            tmp[index] = elements[left]
            left = left + 1
        else:
            tmp[index] = elements[right]
            right = right + 1
        index = index + 1

    while left <= mid:
        tmp[index] = elements[left]
        left = left + 1
        index = index + 1

    while right <= high:
        tmp[index] = elements[right]
        right = right + 1
        index = index + 1

    for i in range(len(tmp)):
        elements[low + i] = tmp[i]


def merge_sort(elements, low, high):
    if low < high:
        mid = int((low + high) / 2)
        merge_sort(elements, low, mid)
        merge_sort(elements, mid + 1, high)
        merge_list(elements, low, mid, high)


if __name__ == '__main__':
    arr = [5, 2, 3, 1]
    merge_sort(arr, 0, len(arr) - 1)
    print(arr)

复制

运行后输出结果:

[1, 2, 3, 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值