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