算法排序 【归并排序】
时间 | 作者 | 版本 | 内容 | 备注 |
---|---|---|---|---|
2023/08/03 | henry_oulen@163.com | v1.0 | 算法排序-归并排序 | |
1.归并排序介绍
基本思想:利用归并的思想实现的排序算法,该算法采用经典的分治策略。分治法分为两个阶段,首先是分阶段,分阶段将问题分成一系列小的问题然后进行递归求解,然后是治阶段,治阶段将分阶段得到的各个答案“修补”在一起,这就是分而治之。
算法实现:对于一个无序序列{4,6,8,5,9}我们使用分治策略可以画出如下图所示,可以看出这种结构很像一颗树,所以我们可以使用递归的方式去实现,分阶段是递归拆分子序列的过程,而治阶段则是将两个已经有序的子序列合并成一个有序的序列。
步骤(1)对于无序序列arr{4,6,8,5,9}来说,我们初始化时让low为序列的首元素下标,mid=low+arr.length,high=mid+1,tmp为辅助序列。
步骤(2)比较low和high所指的元素,谁小谁就插入到tmp序列中,然后谁再向右走一个单位。如下图所示,4<5,将4插入到tmp中,然后low向右走一个单位,然后5<6,再将5插入tmp中,high向右走一个单位。
步骤(3)接着继续(2)步骤,一直到将无序序列中的元素全部插入到tmp中为止,这样tmp就是一个有序的序列了。
步骤(4)在得到无序序列tmp后我们将tmp中的数据拷贝到原序列arr中,这样就将原序列arr变成了一个有序序列。
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)