线性排序算法-归并排序(3)

分治是优化算法中的重要思想。

归并排序的主要技巧,如何处理两个分别已经排好序的数组?

采用额外空间O(n),交替遍历两个数组,时间复杂度为O(n)
将原数组不断向下拆分

举例说明,16个整形数组向下拆分
16-->(8,8)-->(4,4)-->(2,2)(2,2)(2,2)(2,2)->(1,1)(1,1)(1,1)(1,1)(1,1)(1,1)(1,1)(1,1)(1,1)

(1,1)采用归并,生成排好序的(2)
(2,2)采用归并,生成拍好序的(4)
(4,4)-->(8)
(8,8)-->16

    def __Merge(self,a,l,mid,r):
        #排序对象a[l,mid) [mid,r)
        b=[a[i] for i in range(l,r)]
        i = 0
        j = mid-l
        for k in range(l,r):
            if  i == mid-l:
                a[k] = b[j]
                j = j+1
            elif j == r-l :
                a[k] = b[i]
                i = i+1
            elif b[i] > b[j]:
                a[k] = b[j]
                j = j+1            
            else:
                a[k] = b[i]
                i = i+1

循环调用

    def MergeSort2(self,a):
        sz = 1
        total = len(a)
        while(sz< total):
            i = 0
            while(i<total-sz-1):
                self.__Merge(a,i,i+sz,min(i+sz+sz,total))
                i = i+sz+sz
            sz = sz+sz

递归调用

    def __MergeSort(self,a,l,r):
        #排序对象 a[l,r)        
        if (l+1) >= r:
            return        
        """
        ## 在小数组情况下,用插入排序,实验优化效果不好
        if (l+6)<=r:
            self.InsertionSortPart(a,l,r)
            return
        """
        mid = l+(r-l)//2
        self.__MergeSort(a,l,mid)
        self.__MergeSort(a,mid,r)
        self.__Merge(a,l,mid,r)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值