05-十大排序算法-归并排序-Python实现

算法排序 【归并排序】

时间作者版本内容备注
2023/08/03henry_oulen@163.comv1.0算法排序-归并排序

1.归并排序介绍

基本思想:利用归并的思想实现的排序算法,该算法采用经典的分治策略。分治法分为两个阶段,首先是分阶段,分阶段将问题分成一系列小的问题然后进行递归求解,然后是治阶段,治阶段将分阶段得到的各个答案“修补”在一起,这就是分而治之。

算法实现:对于一个无序序列{4,6,8,5,9}我们使用分治策略可以画出如下图所示,可以看出这种结构很像一颗树,所以我们可以使用递归的方式去实现,分阶段是递归拆分子序列的过程,而治阶段则是将两个已经有序的子序列合并成一个有序的序列。

img

步骤(1)对于无序序列arr{4,6,8,5,9}来说,我们初始化时让low为序列的首元素下标,mid=low+arr.length,high=mid+1,tmp为辅助序列。

img

步骤(2)比较low和high所指的元素,谁小谁就插入到tmp序列中,然后谁再向右走一个单位。如下图所示,4<5,将4插入到tmp中,然后low向右走一个单位,然后5<6,再将5插入tmp中,high向右走一个单位。

img

步骤(3)接着继续(2)步骤,一直到将无序序列中的元素全部插入到tmp中为止,这样tmp就是一个有序的序列了。

img

步骤(4)在得到无序序列tmp后我们将tmp中的数据拷贝到原序列arr中,这样就将原序列arr变成了一个有序序列。

img

2.代码实现-Python

#!/usr/bin/python3
# -*- coding:utf-8 -*-
"""
@author: henry_oulen@163.com
@file: 05-归并排序.py
@time: 2023/8/4 15:42
@desc: 
"""

import random
import time


def func_time(func):
    def innrer(*args, **kwargs):
        start_time = time.time()
        result = func(*args, *kwargs)
        end_time = time.time()
        print('函数运行时间为:', end_time - start_time, 's')
        return result

    return innrer


def mergr(leftarr: list, rightarr: list):
    leftIndex, rightIndex, mergeArr = 0, 0, []
    while leftIndex < len(leftarr) and rightIndex < len(rightarr):
        if leftarr[leftIndex] <= rightarr[rightIndex]:
            mergeArr.append(leftarr[leftIndex])
            leftIndex += 1
        else:
            mergeArr.append(rightarr[rightIndex])
            rightIndex += 1
    if leftIndex < len(leftarr):
        mergeArr = mergeArr + leftarr[leftIndex:]
    if rightIndex < len(rightarr):
        mergeArr = mergeArr + rightarr[rightIndex:]

    return mergeArr


def sort(arr: list):
    if len(arr) <= 1:
        return arr
    n = len(arr)

    mid = n // 2
    leftArr = main(arr[:mid])
    rightArr = main(arr[mid:])
    return mergr(leftArr, rightArr)


# @func_time
def main(arr: list):
    """
    :param arr: 需要排序的列表 长度大于1
    :return:
    """
    arr = sort(arr)
    return arr


if __name__ == '__main__':
    arr = [random.randint(0, 10000) for i in range(10)]
    print("排序前列表:", arr)
    arr = main(arr)
    print("排序后列表:", arr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值