栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

递归与分治——√n段合并排序算法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

递归与分治——√n段合并排序算法

√n段合并排序算法: 将数组 划分为 √n个子数组,每个子数组有 个元素。然后递归地对分割后的子数组进行排序,最后将所得到的 个排好序的子数组合并排序。

思路:
分治法的原理是(1)找出基线条件 (2)缩小问题的规模,使其符合极限条件。
在本题中,首先需要解决的是划分数组的问题,规定将a[0,n-1]的数组划分为根号n个子数组(向下取整)。在这里的基线条件就是根号n。但是,根据数组数量,会存在除不尽的情况,可以通过递归调用的方法,再将数列进行分割排序。之后将每个数组单独排序成有序数列,最后将有序数组通过归并排序来合并。

用python代码实现

import math
import random

arr=[]
list=[]
output=[]


#生成数组一个范围在(0,100)间的数组arr
for i in range(48):
    arr.append(random.randint(0,100))

#打印原数组
print("原数组为"+str(arr))
print("数组长度为"+str(len(arr)))


#递归划分并合并排序
def cut(arr):
    

    #若已经划分到最小,则直接返回
    if(len(arr)<2):
        return arr
    
    #向下取整
    n=math.sqrt(len(arr))
    print("根号n为"+str(n))
    
    middle=math.floor(n)
    print("子数列长度为"+str(middle))
    j=0
    i=0
    for j in range (middle):
        
        child = arr[i:i+middle]
        i=i+middle
        child.sort()
        list.append(child)
        print("划分数组为"+str(child))
        
    child=arr[i:len(arr)]
    list.append(child)
    print("剩下的数列为"+str(child))
    
    #长度大于2时继续划分
    if len(child)>2:
        cut(child)



def merge_sort(list):
    num=len(list)
    i=0
    for i in range (0,num-1,2) :
        
        list[i]=merge(list[i],list[i+1])
        
    #清除空元素  
    for a in list:
        
        if (a==[]) :
            list.remove(a)
    #长度大于1时,继续合并        
    if(len(list)>1):
        merge_sort(list)
              
    
#归并排序
def merge(left,right):
    #存放结果
    result=[]
    while left and right:        
        #弹出相对小的数,放到新数组
        if left[0] <= right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    #当数组不为空时,把剩余的数放进数组
    while left:
        result.append(left.pop(0))
    while right:
        result.append(right.pop(0));
    return result

def main():
    print(cut(arr))

    merge_sort(list)

    print("排序后的数组为"+str(list[0]))

main()
结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/861359.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号