排序算法-归并排序

来源:互联网 发布:音频提取软件apk 编辑:程序博客网 时间:2024/06/05 19:00

归并排序

算法描述

归并排序利用了分治法的思想,不是原址排序,算法思路是:(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)