用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 学习数据结构与算法 三、选择排序
- python数据结构与算法 34 归并排序
- 用Python 学习数据结构与算法 五、插入排序&二分查找
- python数据结构与算法----归并排序
- 【java数据结构与算法学习】归并排序
- 用Python 学习数据结构与算法 二、插入排序
- python学习第一步:数据结构与算法
- python学习笔记(二)数据结构与算法
- Python学习笔记:归并排序和快速排序
- python数据结构学习笔记-2016-11-23-01-归并排序
- 新的学习:从Python开始[转]
- 开始学习python了.
- 学习Python知识小结 杂记二
- 使用minidom来处理XML的示例(Python 学习)(转载)
- 开始学习python
- Python相关模块学习1 处理文件名模块glob
- Python学习笔记
- Python学习
- python 与 ruby (ruby学习资源大全)