您的位置:首页 > 其它

排序算法-归并排序

2017-11-21 11:28 155 查看

归并排序

算法描述

归并排序利用了分治法的思想,不是原址排序,算法思路是:(1)分解,将待排序序列递归的分解为两个子序列(从中间位置分解),最终子序列只包含一个元素,即每个子序列都是排好序的;(2)合并,将已经排好序的子序列由下向上合并。

算法实现(python)

#将两个排好序的子序列arr[p:q]和arr[q:r]合并
def mergeArray(arr,p,q,r):
n1=q-p+1
n2=r-q
L=[]   #L[]存放左序列
R=[]   #R[]存放右序列
for i in range(n1):
L.append(arr[p+i-1])
for j in range(n2):
R.append(arr[q+j])
L.append(max(arr)+1)
#设置两个哨兵,其值大于序列最大值即可
R.append(max(arr)+1)
#哨兵的作用在两个子序列合并时,一方显示哨兵,则其不可能是较小的一方。
i=0
j=0
for k in range(p-1,r):
if L[i]<=R[j]:
arr[k]=L[i]
i=i+1
else:
arr[k]=R[j]
j=j+1

#序列分解
def mergeSort(arr,p,r):
if p<r:
q=int((p+r)/2)
mergeSort(arr,p,q)
mergeSort(arr,q+1,r)
mergeArray(arr,p,q,r)

if __name__=="__main__":
arr=[1,4,2,6,5,33,2,44,9,34,23]
mergeSort(arr,2,7)
print arr


算法间复杂度

合并分别包含m和n个元素的已排好序的子序列,需要比较m+n次,因此时间复杂度为二叉递归树的高度(logn)*每层的基础操作数(序列元素数n)。

最好情况:O(n*logn)

最差情况:O(n*logn)

平均情况:O(n*logn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息