核心在于归并两个有序数组:开辟新的空间,三个指针,依次指向第一组数、第二组数、新的数组,比较两个待合并数组的当前元素,将小者放入新数组中。
两种思想:自顶向下(递归)mergeSort;自底向上mergeSortBU
# merge_sort.py
# [l,r]
def __merge(array,l,mid,r):
aux = array.copy()
i = l
j = mid+1
for k in range(l,r+1):
if(i>mid):
array[k] = aux[j]
j+=1
elif(j>r):
array[k] = aux[i]
i+=1
elif(aux[i]<=aux[j]):
array[k] = aux[i]
i+=1
else:
array[k] = aux[j]
j+=1
def __mergeSort(array,l,r):
if(l>=r):
return;
mid = int((l+r)/2)
__mergeSort(array,l,mid)
__mergeSort(array,mid+1,r)
if(array[mid]>array[mid+1]):
__merge(array,l,mid,r)
def mergeSort(array,n):
__mergeSort(array,0,n-1)
def mergeSortBU(array,n):
sz = 1
while(sz<=n):
i = 0
while(i+sz<n):
__merge(array,i,i+sz-1,min(i+2*sz-1,n-1))
i+=2*sz
sz*=2