归并排序和快速排序有一定相似,快速排序是将原始数组依据 mid_value 值,逐渐拆分至每一个元素,而归并排序是首先将数组迭代拆分,拆分至每一个元素后,再将左右元素相互比较,之后逐渐将小数组段拼接起来。
假设一个数组为 array=[1,5,3,8,4,8,2,2]
首先对该数组进行拆分,第一次拆分:
left_array = [1,5,3,8]
right_array = [4,8,2,2]
第二次拆分:
left_array = [1,5]
right_array = [3,8]
第三次拆分:
left_array = [1]
right_array = [5]
拆分完成,对第三次拆分后的数组执行如下操作:
left = 0
right = 0
result = []
while left < len(left_array) and right < len(right_array):
if left_array[left] < right_array[right]:
result.append(left_array[left])
left = left + 1
else:
result.append(right_array[right])
right = right + 1
result += left_array[left:]
result += right_array[right:]
return result
所得 result = [1,5]
迭代就是对 [3]、[8]、[1,5]、[3,8]、[4]、[8]、[2]、[2]、[4,8]、[2,2]、[1,3,5,8]、[2,2,4,8] 依次执行上述步骤
完整程序如下:
import random
def merge_sort(array):
L = len(array)
n=L//2
if n < 1:
return array
left_array = merge_sort(array[:n])
right_array = merge_sort(array[n:])
left = 0
right = 0
result = []
while left < len(left_array) and right < len(right_array):
if left_array[left] < right_array[right]:
result.append(left_array[left])
left = left + 1
else:
result.append(right_array[right])
right = right + 1
result += left_array[left:]
result += right_array[right:]
return result
if __name__ == '__main__':
a=range(1,11)
array = random.sample(a,8)
print(array)
array_sort = merge_sort(array)
print(array_sort)
这次使用了新的生成随机数的方法,因为原先采用 np.random.randint( ) 函数时,所生成的结果 array 是 ndarray 类型,并不能使用列表的 + 方法。