python - Python 中的 Mergesort,我的第一个排序算法,哪里出了问题?

标签 python sorting merge

def mergesort(a):
    if len(a)<=1:
        return a

    else:
        mid=len(a)/2
        mergesort(a[:mid])
        mergesort(a[mid:])
        auxa=[]
        j=0
        k=mid
        while j<mid and k<len(a):
            if a[j]<a[k]:
                auxa.append(a[j])
                j+=1
            else:
                auxa.append(a[k])
                k+=1

        if j==mid:
            auxa.extend(a[k:])

        if k==len(a):
            auxa.extend(a[j:mid])

        a=auxa


        return a

testlist=[3,2,1]   
print mergesort(testlist) 

我得到的结果是 2 1 3

非常感谢任何帮助,谢谢!

最佳答案

您的函数 mergesort 返回一个新列表,并且不会像您期望的那样修改您提供的列表。因此,当您调用 mergesort(a[:mid]) 时,您得到的是这些元素的新排序版本,而原始 a[:mid]保持完全相同。

编辑:这里的问题是 python 列表切片的工作方式。当您说 a[:mid] 时,python 会创建原始文件的“副本”(不用担心副本的确切类型)。现在,当您在函数中修改此副本时,您所做的只是更改其中的引用以指向新的整数,而不是以任何方式修改原始引用。下面是一些代码来充实这一点:

def change(a):
    a[1] = 0

a = [1, 2, 3]
change(a)
a
>> [1, 0, 3]

a = [1, 2, 3]
change(a[:2])
a
>> [1, 2, 3] 

编辑 2:复制回正确完成的值(如评论中 (abamert) 所建议):

def mergesort(a):
  if len(a)<=1:
    return a

  else:
    mid=len(a)/2
    a = mergesort(a[:mid]) + mergesort(a[mid:])
    auxa=[]
    j=0
    k=mid
    while j<mid and k<len(a):
        if a[j]<a[k]:
            auxa.append(a[j])
            j+=1
        else:
            auxa.append(a[k])
            k+=1

    if j==mid:
        auxa.extend(a[k:])

    if k==len(a):
        auxa.extend(a[j:mid])


    return auxa

这显然是更好的方法,涉及的复制更少,但我认为这个解决方案与原始代码的问题更相关。

关于python - Python 中的 Mergesort,我的第一个排序算法,哪里出了问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483380/

相关文章:

python - 如何在 Pandas 中将单级 df 合并为多级 df?

python - 如何更改在 Windows 上运行的 Jupyter Notebook 中的内核名称?

python - 我的变量不包括使用 sublime.get_clipboard() sublime text 插件复制的所有文本

java - 如何在 Java 中存储、排序和打印字符串和 double 的 2D "array"?

使用奇怪的常规代码进行排序

merge - 在 sas 中创建虚拟变量以指示第一次出现观察

python - scipy linalg 确定性/非确定性代码

python - 删除字典中的键/值对不起作用

java - 添加数组的元素直到它达到一个值,当达到该值时找到索引

git - 为什么要使用 "git merge -s ours"?