八大排序算法之归并排序

算法思想:

  将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。

实现步骤:

  1. “分解”——将序列每次折半划分
  2. “合并”——将划分后的序列段两两合并后排序

图示:

  

代码实现

def get_number(num):
    import random
    lst = []
    i = 0
    while i < num:
        lst.append(random.randint(0,100))
        i += 1
    return lst


def merge(left,right):
    i,j = 0,0
    result = []
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def mergesort(lst):
    if len(lst) <=1:
        return lst
    num = len(lst) // 2  # 取整数部分
    left = mergesort(lst[:num])
    right = mergesort(lst[num:])
    return merge(left,right)

a = get_number(10)
print("排序之前:",a)
b = mergesort(a)
print("排序之后:",b)

#####输出结果##########
排序之前: [23, 29, 8, 91, 85, 93, 39, 81, 24, 15]
排序之后: [8, 15, 23, 24, 29, 39, 81, 85, 91, 93]

 性能分析

  时间复杂度:归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(n*log2n)

  空间复杂度:由前面的算法说明可知,算法处理过程中,需要一个大小为n的临时存储空间用以保存合并序列。

  算法稳定性:在归并排序中,相等的元素的顺序不会改变,所以它是稳定的算法。

排序效果

原文地址:https://www.cnblogs.com/vipchenwei/p/7106385.html