在讲归并排序之前我们先来了解一下什么是分治算法。为什么归并排序属于分治算法的体现。

分治算法基本思想就是将一个比较大规模的问题分解成为若干个规模较小的性质和原问题性质必须要保持一致。

 

1. 该问题可以分解成为程序能够执行的子问题。

2. 该问题能够分解。意思就是问题具有最优子结构。 这里我们可以理解成问题通过分解能够递归的来实现解。

3. 该问题分解出来的子集问题得到的解能够合并成为该问题的解。 这个非常重要,直接决定这个问题能否使用分治算法,同时满足这个条件意味着子集问题与原问题在结构上具有一致性。

4. 该问题分解出来的子集问题得出来的解是相互独立的,意味着子集解中没有交集。 这个直接影响分治算法的效率,虽然我们也可以专门对交集做处理,但这样会浪费大量时间。

 

归并排序 是建立在归并操作上的一种排序算法,该方法基本思想采用了分治法来解决。

将已经有序的两个序列集合合并来得到解,首先我们让每个子集序列集有序化,再让每个子集序列间段有序化然后合并得到解。

 

归并算法思路

(1)初始时,把序列的每个元素看成一个有序子序列,子序列长度为都为1.

(2)把序列两两归并,完成一遍后,每个子序列长度加倍。

(3)对加长的子序列重复上面的操作,最终将得到一个长度为n的有序序列。

 

 

import random
import time
import sys


def merge(li, low, mid, high):
    i = low
    j = mid + 1
    ltmp = []
    while i <= mid and j <= high:
        if li[i] < li[j]:
            ltmp.append(li[i])
            i += 1
        else:
            ltmp.append(li[j])
            j += 1
    while i <= mid:
        ltmp.append(li[i])
        i += 1
    while j <= high:
        ltmp.append(li[j])
        j += 1
    li[low:high+1] = ltmp


def merge_sort(li, low, high):
    if low < high:
        mid = (low + high) // 2
        merge_sort(li, low, mid)
        merge_sort(li, mid+1, high)
        merge(li, low, mid, high)


sys.setrecursionlimit(10000)
data = list(range(10000))
random.shuffle(data)
t1 = time.time()
print('排序前:{}'.format(data))
merge_sort(data, 0, len(data)-1)
print('排序后:{}'.format(data))
t2 = time.time()
print('时间:{}'.format(t2-t1))