python实现归并排序_[Python算法实现]归并排序

归并排序用的是分治法,把一个大问题化解为k个中问题,每个中问题再化解为k个小问题,直至问题化为最小可解的问题。对这些问题求解,再不断地合并结果,直至合并完毕。

排序的流程可以参考下图:

完全按照《算法导论》的算法流程写的,其实利用Python的语言特性还有更简便的写法,改天贴上来。

# -*- coding: utf-8 -*-

"""Created on Wed Feb 8 23:01:27 2017@author: liuzimu"""

#自定义merge函数

def merge(L,R):

n = len(L) + len(R)

L.append(float("inf"))

R.append(float("inf"))

i = 0

j = 0

A = []

for k in range(0,n):

if L[i]<=R[j]:

A.append(L[i])

i = i+1

else:

A.append(R[j])

j = j+1

return A

merge([1,5,6],[2,3])

#自定义merge_sort函数

def merge_sort(A):

l = len(A)

if l<=1:

return A

else:

mid = l//2

print(mid)

left = merge_sort(A[0:mid])

right = merge_sort(A[mid:])

return merge(left,right)

#测试merge_sort函数

merge_sort([3,2,1,0,5,8,7,2,-5,9,6,11])

根据Python语言的特性,重新编写了归并排序的算法,看上去更加简洁

def merge(left, right):

res = []

while left and right:

min_val = left.pop(0) if left[0] < right[0] else right.pop(0)

res.append(min_val)

res += left if left else right

return res

def merge_sort(A):

if len(A) <= 1:

res = A

else:

mid = len(A) // 2

left, right = merge_sort(A[:mid]), merge_sort(A[mid:])

res = merge(left, right)

return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值