Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用合并排序来计算拆分反转_Python_Algorithm_Recursion_Mergesort - Fatal编程技术网

在Python中使用合并排序来计算拆分反转

在Python中使用合并排序来计算拆分反转,python,algorithm,recursion,mergesort,Python,Algorithm,Recursion,Mergesort,我试图使用mergesort(我得到的)来计算列表中拆分反转的数量(也就是说,未排序列表前半部分的元素应该出现在未排序列表后半部分的给定元素之后;例如[3 2 1 4]将包含拆分反转(3,1),但不包含(3,2)因为3号和2号都在上半场)。当我到达最后的print语句时,我得到了我期望的答案——在本例中是9——但是返回值都是不可靠的,因为它通过递归返回分割值。我尝试过各种索引组合,但都没有用。有什么帮助吗?(使用Python 2.7) (为了记录在案,这是一个课程作业问题,但我只是为了好玩而学习

我试图使用mergesort(我得到的)来计算列表中拆分反转的数量(也就是说,未排序列表前半部分的元素应该出现在未排序列表后半部分的给定元素之后;例如[3 2 1 4]将包含拆分反转(3,1),但不包含(3,2)因为3号和2号都在上半场)。当我到达最后的print语句时,我得到了我期望的答案——在本例中是9——但是返回值都是不可靠的,因为它通过递归返回分割值。我尝试过各种索引组合,但都没有用。有什么帮助吗?(使用Python 2.7)

(为了记录在案,这是一个课程作业问题,但我只是为了好玩而学习——除了我之外,没有人给这个评分。)

def合并排序(lst):
''递归地将列表分成两半进行排序''
如果len(lst)为1:
返回lst
中间=整数(长(低)/2)
左=合并排序(lst[:中间])
右=合并排序(lst[中间:)
sortedlist=合并(左、右)
返回分类列表
def合并(左、右):
用于对拆分列表进行排序的mergesort的子例程“”。还返回数字
分裂反转的数量(即,从排序的第二个数中每次出现一个数
列表的一半显示在排序后的前半部分的数字之前)“”
i、 j=0,0
拆分=0
结果=[]
而i
您的代码中有一些错误:

  • 不要
    int()
    查看
    len()/2
    的结果。如果您使用的是Python3,我会直接使用带
    /
    运算符的整数除法
  • mergesort()
    第一行中的比较错误。首先,不要使用
    is
    来比较是否相等。
    is
    运算符仅用于标识。如果有两个不同的整数具有相同的值,则它们相等但不相同。对于小整数,我相信至少有一些Python方言会对值进行插值,因此您的比较是有效的,但您依赖的是一些无法保证的东西。但是,使用
    ==
    也不起作用,因为您忘记了空列表的大小写
  • 我猜您的实际问题(“不稳定的返回值”)是由以下事实引起的:您返回两个值(作为元组)存储在一个名称下,然后作为参数传递给递归
    merge()
    调用

修改
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

因为,在您的代码中,merge返回一对,所以mergesort还必须返回一对。 启用要获取列表中的总拆分反转,必须添加左半部分、右半部分和合并拆分反转

这是我对你的代码所做的修改

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

如果len(lst)是1?为什么不使用==运算符?middle=int(len(lst)/2)?为什么这里需要int()呢?那么,堆栈样式的问题。我明白这些东西是怎么不正确的,尽管与手头的问题无关——我是回到这里编辑我的原始代码,还是这会让本页的未来读者更加困惑?@Thumbtack小偷,该死的疯子,当然,我现在正在挣扎。我甚至无法想象这会如此困难。这只是第一周)我认为int()是不必要的。它包含在我的阅读中,所以我认为有一些我没有看到的目的。b) 我正在准备白板面试。我有输入=的习惯,我的意思是==(我在第一次测试中就明白了),但我担心我会犯那个错误。我刚刚发现‘是’——我想我不清楚它与==有什么不同。c) 这确实是我的问题;我试着把它作为两个变量返回——我想这是一个显而易见的解决方案——但是没有用。我也试过了。。。是的,我得到了错误:回溯(上次的最新调用):文件“/Users/paulnichols/Dropbox/Algorithms/merge_sort.py”,第32行,打印中的mergesort([7,2,6,4,5,1,3,8])文件“/Users/paulnichols/Dropbox/Algorithms/merge_sort.py”,第3行,如果len(lst[0])@thumbtackstepher:注意,在基本情况下,你需要返回
lst,0
,而不是只返回
lst
。我认为你找到了一些东西,因为这显然是我忽略的东西,但这并不能改变错误。尝试返回
lst,0
<代码>lst[0];和
lst,splits
我将Python2.7与您的
merge
函数一起使用,它会产生正确的结果。
def mergesort(lst):
    '''Recursively divides list in halves to be sorted'''
    if len(lst) == 1:
        return lst, 0
    middle = len(lst)/2
    left, s1 = mergesort(lst[:middle])[0]  # Ignore intermediate splits
    right, s2 = mergesort(lst[middle:])[0]  # Ignore intermediate splits
    sortedlist, s3 = merge(left, right)
    return sortedlist, (s1+s2+s3)`