python mergesort 小思考,请高手指点

在PYTHON下写了个MERGESORT,代码如下:

import time
import random

def mergesort(l):
   
    """
    l : list to be sorted
    """

    if len(l) <= 1:
        return l
    else:
        middle = int(len(l)/2)
        left = mergesort(l[:middle])
        right = mergesort(l[middle:])
        return merge(left, right)
       
def merge(left, right):

    # list l will be returned
    l1 = []

    # We do this because pop seems to be efficient at the end
    while(len(left) != 0 and len(right) != 0):
        left_element = left[0]
        right_element = right[0]
        if left_element <= right_element:
            l1.append(left_element)
            left.pop(0)
        else:
            l1.append(right_element)
            right.pop(0)
      
    # We quit the loop when one list becomes empty
    if len(left) == 0:
        l1 = l1 +  right
    else:
        l1 = l1 + left
    return l1

def main():
    l = []
    for i in range(200):
        l.append(random.randrange(0, 1001))
    starttime = time.clock()
    l1 = mergesort(l)
    endtime = time.clock()
    print(endtime - starttime)

if __name__ == "__main__":
    main()

 

由于python的LIST实在和c++的VECTOR很像(都有什么不同?没研究过。。。),所以很怀疑pop(0)的性能,重新写了一个merge function:

 

def merge(left, right):

    # list l will be returned
    l1 = []
    index_left = 0
    index_right = 0
    len_left = len(left)
    len_right = len(right)
   
    # We do this because pop seems to be efficient at the end
    while(index_left != len_left and index_right != len_right):
        left_element = left[index_left]
        right_element = right[index_right]
        if left_element <= right_element:
            l1.append(left_element)
            index_left += 1
        else:
            l1.append(right_element)
            index_right += 1
      
    # We quit the loop when one list becomes empty
    if index_left == len_left:
        l1 = l1 +  right[index_right:]
    else:
        l1 = l1 + left[index_left:]
    return l1

 

时间上提高了一倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值