Python鱼

2024-09-30 06:16:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现Python合并排序,但在某些方面失败了。我得到的伪代码是准确的,但看起来它是为另一种语言而构建的。在

pseudo需要以下内容
/声明输入数组a大小的数组temp

我不确定这在Python中是如何实现的。总之,代码在下面。 整个想法是我需要对数组/列表进行排序并返回排序后的数组/列表。在

到目前为止,它失败的消息如下。我想说这是因为新的temp数组/列表,但我不确定

Traceback (most recent call last):  
  File "./mergesort", line 56, in <module>  
    main()  
  File "./mergesort", line 52, in main  
    mergesortbase(array)  
  File "./mergesort", line 4, in mergesortbase  
    mergesort(num, 0, len(num)-1)  
  File "./mergesort", line 10, in mergesort  
    mergesort(num, low, mid)  
  File "./mergesort", line 10, in mergesort  
    mergesort(num, low, mid)  
  File "./mergesort", line 12, in mergesort  
    merge(num, low, mid, mid+1, high)  
  File "./mergesort", line 27, in merge  
    temp[k] = a[j]  
IndexError: list assignment index out of range  

注意:对代码进行彻底的修改是没有帮助的,因为我需要使用完全相同的伪代码。在

^{pr2}$

Tags: 代码in列表排序mainline数组merge
3条回答

你能复制输入数组吗?在

温度=a.副本()

它的尺寸是一样的。在

如果要将temp中的所有元素初始化为某个值,请使用类似于:

温度=[0]*长度(a)

你的代码有三个错误

  1. temp没有初始化为任何大小,因此k总是给出list assignment index out of range

  2. 第二个while循环用于将剩余元素l1添加到u1,只需运行到u1而不是u2:

  3. 第三个while循环将剩余元素从l2添加到u2需要增加j,而不是{}。在

    def merge(a, l1, u1, l2, u2):
        temp = [0]*len(a)
        i = l1
        j = l2
        k = l1
        while (i <= u1 and j <= u2):
            if (a[i] <= a[j]):
                temp[k] = a[i]
                i = i + 1
            else:
                temp[k] = a[j]
                j = j + 1
    
            k = k + 1
        while ( i <= u1 ):
            temp[k] = a[i]
            k = k + 1
            i = i + 1
        while ( j <= u2 ):
            temp[k] = a[j]
            k = k + 1
            j = j + 1
    
        h = l1
    
        while ( h <= u2 ):  
            a[h] = temp[h]
            h = h + 1
    

我很好奇为什么不直接使用Python内置的排序工具,根据您的需要,sort或{}。它可能比你自己滚动的东西更有效率(除非你在数据集上使用特定的额外信息,这里似乎不是这样)。你这样做可能是出于教育目的,在这种情况下,你可以随意忽略这段话,但如果你只是想整理一些数据,我就不提内置的东西了。在

在任何情况下,您的具体问题似乎是如何“声明输入数组a大小的数组温度”。在

这句话很容易做到:

temp = [0] * len(a)

以下文字说明:

^{pr2}$

你现在拥有的是:

temp = []

这将创建一个大小为零的列表,后跟:

temp[k] = a[i]

这总是会引起一个问题,因为没有值k来处理它。在


除此之外,实际的合并还存在缺陷,因为您使用了不正确的变量来处理数组。您已经在逻辑上将某些项绑定在一起,例如将i与第一个数组节绑定在一起,j与第二个数组节绑定在一起,但随后又违反了这一点:

while ( i <= u2 ):  # i and u1 should be associated: while i <= u1:
   temp[k] = a[i]   # (no need for '()' in Python conditions by the way).
   k = k + 1
   i = i + 1

while ( j <= u2 ):
   temp[k] = a[j]
   k = k + 1
   i = i + 1        # j and u2 should be associated: j = j + 1

即使修复了数组创建,上面的第二个循环也可能会导致问题。它将永远运行(或直到异常,以先到者为准),因为您正在检查j,但从不更改它。但是,上述两项均不正确,因此应予以修正。在

一旦我使数组的大小正确,进行这两个更改,并在排序之前和之后打印出数组,它看起来会更好一些:

[8, 5, 7, 1, 9, 3]
[1, 3, 5, 7, 8, 9]

相关问题 更多 >

    热门问题