归并排序实质就是不断的对一个数组进行左右区间的划分, 当划分到最小块的时候,则左右两边均只有一个元素时这个时候通过merge 将他们在该块进行排序合并。最后将排序好的块在写入原数组。然后一次进行更大块的合并。这样每次合并的两个块在各自的分组是有序的。
因此合并只需要建立两个索引,一个指向左边的分区,一个指向右边的分区,然后进行赋值排序,当一个分区的索引移动到终点(左边终点是middle,右边终点则是传进来的left)则可以认为当前区已经整体有序,接下来就是将剩下的元素一次添加进temp数组,最后根据该次merge的左右区间 将temp数组再写回原数组
def mergeSort(arr, left , right):
if left < right:
middle = math.floor((left + right)/2)
mergeSort(arr, left, middle)
mergeSort(arr, middle+1 , right)
merge(arr, left, middle, right)
def merge(arr, left, middle, right):
temp = []
indexLeft = left
indexRight = middle + 1
while indexLeft <= middle and indexRight <= right:
if(arr[indexLeft] < arr[indexRight]):
temp.append(arr[indexLeft])
indexLeft += 1
else :
temp.append(arr[indexRight])
indexRight += 1
while indexLeft <= middle:
temp.append(arr[indexLeft])
indexLeft += 1
while indexRight <= right:
temp.append(arr[indexRight])
indexRight += 1
for value in temp:
arr[left] = value
left += 1
l = [0,0,1,3,222,11,5777,799,0]
mergeSort(l,0, len(l) - 1)
print(l)