算法-归并排序(python)

归并排序

        将一个长数组先进行递归拆分,拆分成很小的数组,逐层向下,具体就是拆分到数组元素个数为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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值