归并排序,《学点算法吧,Python》

一、归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。


二、归并排序算法步骤

归并算法步骤

  1. 将一个序列从中间位置分成两个序列;
  2. 在将这两个子序列按照第一步继续二分下去;
  3. 直到所有子序列的长度都为1,也就是不可以再二分截止。
  4. 这时候再两两合并成一个有序序列即可。

如图:

 所谓归并,实际就是递归将序列分解成单一元素序列再用合并排序生成新的有序序列

分解序列

  • 比较简单,从序列中间分解,递归就可以了,不再单独介绍。

合并排序

  • 需要一个空序列用于存放排序后的序列
  • 输入的两个顺序序列
  • 三个索引用于定位操作的元素

具体实现原理如下:

  1. 蓝色索引黑色索引进行比较
  2. 将较小的数值填入新序列的绿色索引处,同时将相应的索引后移
  3. 重复运行1、2,直到有一个索引大于序列长度,将另一个序列索引后面的序列拼接到新序列

归并排序实际运行中递归和合并排序是交织再一起的,具体流程可以参考代码部分。


归并排序Python实现

  先上序列,生成随机序列:

import random

def ord_list(n):
    ord = list(range(n))
    return ord
def ran_list(n):
    ran = ord_list(n)
    random.shuffle(ran)
    return ran

排序代码:

def mergeSort(list):
    #递归终止条件:元素只有一个或者为空
    if len(list)<2:
        return list
    mid=len(list)//2
    left,right=list[0:mid],list[mid:]
    return merge(mergeSort(left),mergeSort(right)) #在这里实现递归 和合并排序,记住每一个mergeSort内都包含merge

def merge(left,right):
    new_list=[]
    l_index, r_index= 0, 0,
    while left and right:
        if l_index>=len(left):#左侧序列没有数据了
            new_list+=right[r_index:]
            return new_list
        elif r_index>=len(right):#右侧序列没有数据了
            new_list+=left[l_index:]
            return new_list
        if left[l_index]<right[r_index]:#比较两个序列指针值,选出较小的值
            new_list.append(left[l_index])
            l_index+=1
        else:
            new_list.append(right[r_index])
            r_index += 1

归并排序的代码运行流程,如下图红线运行路线,如果不明白可以结合下图慢慢体会

 

看看效果:

if __name__=='__main__':
    test_list =ran_list(10)
    print(test_list)
    final_list=mergeSort(test_list)
    print(final_list)

'''
输出如下:
[1, 9, 8, 5, 4, 7, 0, 6, 3, 2]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''

总结

归并算法的学习需要一点点耐心,如果还是不明白,可以对照代码和流程图反复研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值