【问题标题】:Arrange given list of integers to get least number using merge sort in python在python中使用合并排序排列给定的整数列表以获得最少的数字
【发布时间】:2015-12-09 10:28:43
【问题描述】:

假设我给定的数组是 [9,89,10005,77987] ,我在合并排序算法中使用了自定义比较。我想得到 [10005,77987,89,9] 以后可以用来获得最少的数字1000577987899 排列数字后。我正在使用 random.randint(0,100) 生成一个数组。 我的意见:[70, 73, 85, 60, 76] 我的输出:

before: [70, 73, 85, 60, 76]
['70', '73', '85', '60', '76']
splitting the array ['70', '73', '85', '60', '76']
splitting the array ['70', '73']
merging ['70', '73']
splitting the array ['85', '60', '76']
splitting the array ['60', '76']
merging ['60', '76']
Traceback (most recent call last):
File "venture.py", line 66, in <module>
mergeSort(b)
  File "venture.py", line 33, in mergeSort   
mergeSort(righthalf) #the recursive call after splitting
  File "venture.py", line 41, in mergeSort
if  int(lefthalf[i])*10**len(righthalf[j])+int(righthalf[j]) < int(righthalf[j])*10**len(lefthalf[i])+int(lefthalf[j]): #custom_comparison
IndexError: list index out of range

我的代码:

import random

def mergeSort(alist):
    if len(alist)>1:
        print "splitting the array",alist
        mid = len(alist)//2  #the floor div
        lefthalf = alist[:mid]
        righthalf = alist[mid:]
        mergeSort(lefthalf)  #the recursive call after splitting
        mergeSort(righthalf) #the recursive call after splitting

        i=0
        j=0
        k=0


        while i < len(lefthalf) and j < len(righthalf):
            if  int(lefthalf[i])*10**len(righthalf[j])+int(righthalf[j]) < int(righthalf[j])*10**len(lefthalf[i])+int(lefthalf[j]): #custom comparison
                alist[k]=lefthalf[i]
                i=i+1
            else:
                alist[k]=righthalf[j]
                j=j+1
            k=k+1

        while i < len(lefthalf):  #to be used when index j is out of range of len(righthalf)
            alist[k]=lefthalf[i]
            i=i+1
            k=k+1

        while j < len(righthalf): #to be used when index i is out of range of len(lefthalf)
            alist[k]=righthalf[j]
            j=j+1
            k=k+1
        print "merging",alist



a = [random.randint(0,100) for c in range(5)]
print "before:",a
b = map(str, a)
print b
mergeSort(b)
print "new :",b

为什么会发生错误? 相同的代码适用于常规比较if lefthalf[i] &lt; righthalf[j]:。我只是将if条件更改为if int(lefthalf[i])*10**len(righthalf[j])+int(righthalf[j]) &lt; int(righthalf[j])*10**len(lefthalf[i])+int(lefthalf[j]): #custom comparison。 我哪里错了?

【问题讨论】:

    标签: python-2.7 sorting merge


    【解决方案1】:

    请记住,如果原始列表 (alist) 是奇数,righthalflefthalf 将具有不同的长度。

    您的 while 条件是 j &lt; len(righthalf),但您的 if 条件使用 lefthalf[j]

    alist 为奇数且len(alist) = 2N+1 时,在j 上升到len(righthalf)-1 = (N+1)-1 = N 的情况下,您将收到索引超出范围错误,因为lefthalf[N] 超出范围。

    【讨论】:

    • 再次感谢 ali,现在工作正常。我忘记正确检查索引了。
    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 2020-10-25
    • 2011-07-05
    • 2012-11-20
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多