ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

[经典算法]合并排序 Merge-Sort

2021-12-18 23:02:44  阅读:157  来源: 互联网

标签:Sort MergeSort right temp Merge 排序 left


合并排序(归并排序)采用分治法(Divide and Conquer),先递归分解数组,将序列每次折半划分,再合并数组,将划分后的序列两两合并后排序。

基本方法:

1、将序列从中间位置分成左右两个序列

2、再将这两个子序列按照第1步继续二分下去,直到所有左右子序列的长度都为1

3、将合并排序的左右序列合并成一个有序序列

def Merge(left, right): # 将左右数组元素排序并合并成一个数组
    temp = []
    i = j = 0
    while i < len(left) and j < len(right): # 将两边数组的元素进行比较,选择较小的填进临时数组,直到将一边填完
        if left[i] < right[j]:
            temp.append(left[i])
            i += 1
        else:
            temp.append(right[j])
            j += 1
 
    if i == len(left): # 左侧数组已比对完,把右侧数组剩余数据全部填充到数组
        for k in right[j:]:
            temp.append(k)
    else: # 右侧数组已比对完,把左侧数组剩余数据全部填充到数组
        for h in left[i:]:
            temp.append(h)
    print('Merge temp:',temp)
    return temp
 
 
def MergeSort(ls):
    if len(ls) < 2: # 单个元素列表无需排序
        return ls
    middle = len(ls)//2
    left = MergeSort(ls[:middle]) # 左边列表元素递归分解并排序
    print('MergeSort left:',left)
    right = MergeSort(ls[middle:]) # 右边列表元素递归分解并排序
    print('MergeSort right:',right)
    return Merge(left, right) # 左右两边分解的列表做最后合并

        
a = [8,4,5,7,1,3,6,2]
print('合并排序结果为:',MergeSort(a))
====================== RESTART: test.py ======================
MergeSort left: [8]
MergeSort right: [4]
Merge temp: [4, 8]
MergeSort left: [4, 8]
MergeSort left: [5]
MergeSort right: [7]
Merge temp: [5, 7]
MergeSort right: [5, 7]
Merge temp: [4, 5, 7, 8]
MergeSort left: [4, 5, 7, 8]
MergeSort left: [1]
MergeSort right: [3]
Merge temp: [1, 3]
MergeSort left: [1, 3]
MergeSort left: [6]
MergeSort right: [2]
Merge temp: [2, 6]
MergeSort right: [2, 6]
Merge temp: [1, 2, 3, 6]
MergeSort right: [1, 2, 3, 6]
Merge temp: [1, 2, 3, 4, 5, 6, 7, 8]
合并排序结果为: [1, 2, 3, 4, 5, 6, 7, 8]

image

标签:Sort,MergeSort,right,temp,Merge,排序,left
来源: https://www.cnblogs.com/gisen_6/p/15706318.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有