归并排序
将一个长数组先进行递归拆分,拆分成很小的数组,逐层向下,具体就是拆分到数组元素个数为1时,再进行合并,逐层向上,每一层都进行合并操作,合并两个有序数组。
第一步:
先写出合并两个有序数组的函数
def merge_sort_two_vector(vector1, vector2, vector):
"""
合并 两个有序数组
"""
i = 0
j = 0
# 当vector1 和 vector2 都有值时,比较的都是从头部元素开始
# 小的话,就将元素加入vector,下标加1,直到有一个为空
while (i<len(vector1) and j<len(vector2)):
if vector1[i] <= vector2[j]:
vector.append(vector1[i])
i+=1
else:
vector.append(vector2[j])
j+=1
# 最后只可能两种情况:vector1有剩余 或 vector2有剩余
# 当vector1还有剩余时,将剩余元素加到vector中
if i < len(vector1):
vector += vector1[i:]
# 当vector2还有剩余时,将剩余元素加到vector中
if j < len(vector2):
vector += vector2[j:]
return vector
第二步:
关键的递归和合并
def merge_sort(vector):
"""
归并排序
"""
# 拆分到元素个数为1时返回
if len(vector)<2:
return
# 除2,分成两半
mid = len(vector)//2
sub_vector1 = vector[0: mid]
sub_vector2 = vector[mid:]
print("---------start--拆分---")
print("sub_vector1:-----%s"%sub_vector1)
print("sub_vector2:-----%s"%sub_vector2)
print("vector地址:----%s"%id(vector))
print("sub_vector1地址:----%s"%id(sub_vector1))
print("sub_vector2地址:----%s"%id(sub_vector2))
print("---------end----拆分---")
# 递归调用,将sub_vector1、sub_vector2进行拆分/合并
merge_sort(sub_vector1)
merge_sort(sub_vector2)
# vector的作用:就是保留传入参数vector的地址,不要其中的值
vector.clear()
print("--------start--合并---")
# 此时,sub_vector1、sub_vector2都是有序数组,合并后返给vector
merge_sort_two_vector(sub_vector1, sub_vector2, vector)
print("sub_vector1:-----%s"%sub_vector1)
print("sub_vector2:-----%s"%sub_vector2)
print("vector----%s"%vector)
print("--------end-合并--")
简单测试
vector = [7,2,5,10,3,8,4,1,9,6]
# vector = [7,2,5,9,6]
# vector = [7,9,6]
res = merge_sort(vector)
print(vector)
结果
---------start--拆分--- sub_vector1:-----[7, 2, 5, 10, 3] sub_vector2:-----[8, 4, 1, 9, 6] vector地址:----2355242151432 sub_vector1地址:----2355239902408 sub_vector2地址:----2355239905928 ---------end----拆分--- ---------start--拆分--- sub_vector1:-----[7, 2] sub_vector2:-----[5, 10, 3] vector地址:----2355239902408 sub_vector1地址:----2355241547208 sub_vector2地址:----2355242150920 ---------end----拆分--- ---------start--拆分--- sub_vector1:-----[7] sub_vector2:-----[2] vector地址:----2355241547208 sub_vector1地址:----2355241548040 sub_vector2地址:----2355241958152 ---------end----拆分--- --------start--合并--- sub_vector1:-----[7] sub_vector2:-----[2] vector----[2, 7] --------end-合并-- ---------start--拆分--- sub_vector1:-----[5] sub_vector2:-----[10, 3] vector地址:----2355242150920 sub_vector1地址:----2355241958152 sub_vector2地址:----2355241548040 ---------end----拆分--- ---------start--拆分--- sub_vector1:-----[10] sub_vector2:-----[3] vector地址:----2355241548040 sub_vector1地址:----2355242078536 sub_vector2地址:----2355239901512 ---------end----拆分--- --------start--合并--- sub_vector1:-----[10] sub_vector2:-----[3] vector----[3, 10] --------end-合并-- --------start--合并--- sub_vector1:-----[5] sub_vector2:-----[3, 10] vector----[3, 5, 10] --------end-合并-- --------start--合并--- sub_vector1:-----[2, 7] sub_vector2:-----[3, 5, 10] vector----[2, 3, 5, 7, 10] --------end-合并-- ---------start--拆分--- sub_vector1:-----[8, 4] sub_vector2:-----[1, 9, 6] vector地址:----2355239905928 sub_vector1地址:----2355242150920 sub_vector2地址:----2355241547208 ---------end----拆分--- ---------start--拆分--- sub_vector1:-----[8] sub_vector2:-----[4] vector地址:----2355242150920 sub_vector1地址:----2355241548040 sub_vector2地址:----2355241958152 ---------end----拆分--- --------start--合并--- sub_vector1:-----[8] sub_vector2:-----[4] vector----[4, 8] --------end-合并-- ---------start--拆分--- sub_vector1:-----[1] sub_vector2:-----[9, 6] vector地址:----2355241547208 sub_vector1地址:----2355241958152 sub_vector2地址:----2355241548040 ---------end----拆分--- ---------start--拆分--- sub_vector1:-----[9] sub_vector2:-----[6] vector地址:----2355241548040 sub_vector1地址:----2355239901512 sub_vector2地址:----2355242078536 ---------end----拆分--- --------start--合并--- sub_vector1:-----[9] sub_vector2:-----[6] vector----[6, 9] --------end-合并-- --------start--合并--- sub_vector1:-----[1] sub_vector2:-----[6, 9] vector----[1, 6, 9] --------end-合并-- --------start--合并--- sub_vector1:-----[4, 8] sub_vector2:-----[1, 6, 9] vector----[1, 4, 6, 8, 9] --------end-合并-- --------start--合并--- sub_vector1:-----[2, 3, 5, 7, 10] sub_vector2:-----[1, 4, 6, 8, 9] vector----[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] --------end-合并-- [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]