ICode9

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

合并排序以计算Python中的拆分反转

2019-05-20 14:46:35  阅读:197  来源: 互联网

标签:python algorithm recursion mergesort


我试图使用mergesort – 我得到 – 来计算列表中的拆分反转次数(也就是说,未排序列表的前半部分中的元素应该出现在后半部分中的给定元素之后)未排序的列表;例如[3 2 1 4]将包含拆分反转(3,1),但不包含(3,2),因为3和2都在前半部分).当我得到最终的打印语句时,我得到了我期望的答案 – 在这种情况下为9 – 但返回值都是因为它通过递归返回拆分值而变得很难.我已经尝试了各种索引组合无济于事.有帮助吗? (使用Python 2.7)

(为了记录,这是一个Coursera的家庭作业问题,但我只是为了好玩而学习 – 除了我以外,没有人对此进行评分.)

def mergesort(lst):
    '''Recursively divides list in halves to be sorted'''
    if len(lst) is 1:
        return lst
    middle = int(len(lst)/2)
    left  = mergesort(lst[:middle])
    right = mergesort(lst[middle:])
    sortedlist = merge(left, right)
    return sortedlist

def merge(left, right):
    '''Subroutine of mergesort to sort split lists.  Also returns number
    of split inversions (i.e., each occurence of a number from the sorted second
    half of the list appearing before a number from the sorted first half)'''
    i, j = 0, 0
    splits = 0
    result = []
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
            splits += len(left[i:])
    result += left[i:]
    result += right[j:]
    print result, splits
    return result, splits


print mergesort([7,2,6,4,5,1,3,8])

解决方法:

修改mergesort函数以忽略中间拆分.

def mergesort(lst):
    '''Recursively divides list in halves to be sorted'''
    if len(lst) == 1:
        return lst, 0
    middle = len(lst)/2
    left = mergesort(lst[:middle])[0]  # Ignore intermediate splits
    right = mergesort(lst[middle:])[0]  # Ignore intermediate splits
    sortedlist, splits = merge(left, right)
    return sortedlist, splits

标签:python,algorithm,recursion,mergesort
来源: https://codeday.me/bug/20190520/1143646.html

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

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

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

ICode9版权所有