动图展示
算法时间复杂度o(n*logn)
python
归并的思路在于先分再和,分的过程如下:
先将数组进行一半一半的拆分,直到不能再拆分未知。
之后进行合并的操作,这个合并的操作主要是合并另个有序数组。我们先比较两个有序数组的第一个元素,将小的放到一个空数组中,然后将这个小的数据原始所在的那个数组的指针往后移一个。继续与另一个数组进行比较,继续将小的放到空数组的下一个中。直到任何一个数组全部的元素出完之后,将另一个数组的所有元素放到空数组接下来的位置。
def merge(left_arr, right_arr);
empty = []
left_index = right_index = 0
#当两个数组都有元素的时候
while left_index < len(left_arr) and right_index < len(right_arr):
if left_arr[left_index] < right_arr[right_index]:
empty.append(left_arr[left_index])
left_index += 1
else:
empty.append(right_arr[right_index])
right_index+= 1
#当left数组的元素归并完了
if left_index == len(left_arr):
for num in right_arr[right_index:]:
empty.append(num)
#当right数组的元素归并完了
else:
for num in left_arr[left_index:]:
empty.append(num)
def merge_sort(arr):
if len(arr)<=1:
return arr
middle_index = len(arr)/2
left_arr = merge_sort(arr[:middle_index])
right_arr = merge_sort(arr[middle_index:])
return merge(left_arr, right_arr)
if __name__ == '__main__':
arr = [1,3,5,7,9,2,8,0,-1,-2]
output = merge_sort(arr)
print output