您的位置:首页 > 理论基础 > 数据结构算法

用Python 学习数据结构与算法 四、归并排序

2016-08-11 16:30 459 查看
归并排序主要的过程是将大数组拆分为小数组,再将小数组问题解决,然后归并处理组成新无问题的数组再次归并。

上代码:

#coding=utf-8

#归并运算
#array=》数组
#lPos=》左坐标
#mPos=》中坐标
#rPos=》右坐标
def merge(array, lPos, mPos, rPos):
#切片左右数组
leftArr = array[lPos:mPos]
rightArr = array[mPos:rPos]

#获得数组长度
nTotal = len(array)

#创建整理数组后存放的新容器
arrNew = [0,] * nTotal

#获得左右数组长度
leftLen = len(leftArr)
rightLen = len(rightArr)

#左右遍历引索量
leftIndex = 0
rightIndex = 0
#print(leftArr, rightArr)
#向新容器里添加相应合适数值
for i in range(0, nTotal):
#print((leftIndex, leftLen), (rightIndex, rightLen), arrNew)
if leftIndex == leftLen:
#特殊情况,左数组添加完
arrNew[i] = rightArr[rightIndex]
rightIndex = rightIndex + 1
elif rightIndex == rightLen:
#特殊情况,右数组添加完
arrNew[i] = leftArr[leftIndex]
leftIndex = leftIndex + 1
else:
#情况2,比较左右数组值
if leftArr[leftIndex] > rightArr[rightIndex]:
arrNew[i] = rightArr[rightIndex]
rightIndex = rightIndex + 1
else:
arrNew[i] = leftArr[leftIndex]
leftIndex = leftIndex + 1
#返回新容器
return arrNew

#递归拆分
#array=》数组
#lPos=》左坐标
#rPos=》右坐标
def merge_sort(array, lPos, rPos):
#print((lPos, rPos), array)
#判断rPos-1是为了处理array的切片问题
if lPos < (rPos - 1):
#mPos = (rPos - lPos) // 2
#取中引索
mPos = rPos // 2
#切片左数组
leftArr = array[lPos:mPos]
#print((lPos, mPos, rPos), leftArr, array)

#递归左数组
leftArr = merge_sort(leftArr, 0, len(leftArr))

#切片右数组
rigthArr = array[mPos:rPos]
#递归右数组
rigthArr = merge_sort(rigthArr, 0, len(rigthArr))
#print('rigth',(lPos, mPos, rPos), rigthArr, array)
#组合数组
resultArr = leftArr + rigthArr
#排序
return merge(resultArr, 0, len(resultArr) // 2, len(resultArr))

#返回数组中只有一个元素
return array

A = [5, 2, 4, 6, 1, 3]
#print(merge(A,0, len(A) // 2, len(A)))
print(merge_sort(A, 0, len(A)))


输出结果 :

[1, 2, 3, 4, 5, 6]


用切片写的我晕头转向的,更清晰的方式则是在原数组上修改,这样只用考虑坐标,而不用去想切片特性造成的影响。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 算法 归并排序