二路归并排序算法

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

 

二路归并排序关键点:

  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

二路归并排序算法_第1张图片

 

看一下用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]

你可能感兴趣的:(排序算法,算法,数据结构)