排序算法之归并排序的python实现

采用分治法:

分割:递归地把当前序列平均分割成两半。

集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。

归并操作(归并算法),指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

递归法(Top-down)

1.申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

2.设定两个指针,最初位置分别为两个已经排序序列的起始位置

3.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4.重复步骤3直到某一指针到达序列尾

5.将另一序列剩下的所有元素直接复制到合并序列尾

迭代法(Bottom-up)

原理如下(假设序列共有 n个元素):

1.将序列每相邻两个数字进行归并操作,形成 c e i l ( n / 2 ) 个序列,排序后每个序列包含两/一个元素

2.若此时序列数不是1个则将上述序列再次归并,形成 c e i l ( n / 4 )个序列,每个序列包含四/三个元素

3.重复步骤2,直到所有元素排序完毕,即序列数为1

下面为快速排序的代码实现:

def merge_sort(lst):
    if len(lst) <= 1:
        # 当列表元素只有一个的时候,直接返回
        return lst
    mid = len(lst) // 2
    left = lst[:mid]
    right = lst[mid:]

    left = merge_sort(left)
    right = merge_sort(right)
    # 递归的进行排序
    result = []
    while left and right:
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    if left:
        result += left
    if right:
        result += right
    return result
    # 返回排序后的结果


if __name__ == "__main__":
    li = [9, 4, 2, 3.6, -1, 0, 25, -34, 8, 9, 1, 0]
    print("排序前的队列:",li)
    print("排序后的队列:", merge_sort(li))
posted @ 2019-11-15 12:10  pycoder_hsz  阅读(1432)  评论(0编辑  收藏  举报