合并排序没有正确发生 - Python

时间:2016-09-03 19:00:30

标签: python mergesort

排序没有正确进行。有人可以帮助用这种方法进行分类。还请让我知道我哪里出错了。我是Python的新手,所以我自己这样做。我正在使用通常的方法,就像我们用C语言或其他语言一样。

base =[5,4,3,2,1]

def splitarray (low, high):
    if  low < high:
        mid = (high+low)/2

        splitarray (low, mid)
        splitarray (mid+1,high)
        merge(low,mid,high)

    else:
        return

def merge(low,mid,high):
    print("merge " +str(low) + " - " +str(mid)+" - "+ str(high))
    result = [0]*len(base)
    k = 0
    i=low
    j=mid+1
    l=0


    while i <= mid and j <= high:
        if (base[i] < base[j]):

            result[k]= base[i]
            k+=1
            i += 1

        if (base[i] > base[j])  :


            result[k]= base[j]

            j += 1
            k += 1





    while i <= mid:
        result[k]= base[i]
        k += 1
        i += 1
    while j <= high:
        result[k]= base[j]
        #count = count + mid - i
        j += 1
        k += 1

    print result

    l = low
    k= 0
    while l <= high:
        base[l] = result[l]
        l += 1


    print base
splitarray(0,len(base)-1)

2 个答案:

答案 0 :(得分:2)

视觉上算法的运作方式是:enter image description here

因此,实现合并排序最明显的方法是为每个合并返回一个新列表。也许这可以针对您尝试做的事情进行优化,即在单个顶级result上运行。但是如果你这样做,你就不能在每个合并级别附加result。因为在递归的底层,你将添加四个元素,然后在中间级别添加四个元素,然后在顶层你将添加另外四个元素。它太多了。如果你这样做,你应该有一个固定的result大小,并在整个执行过程中操作它的索引。

第二个错误是你正在为每次合并阅读未经修改的base。每个合并步骤的前提条件是合并的两个列表已经排序。如果您以显而易见的方式实现算法,则可以使用更深层合并的返回值。如果您使用顶级result以某种优化方式实施算法,那么您应该从result开始,而不是base

答案 1 :(得分:1)

您当前(已更新)代码的问题似乎与最后一个循环有关:<​​/ p>

l = low
k= 0
while l <= high:
    base[l] = result[l]
    l += 1

此处您将值从results列表复制到base列表。但是,结果都在results的开头,而不是您希望它们进入base的相同坐标。您似乎已将几乎弄好了,因为您将k设置为零,但您最终不会在循环中使用k

尝试:

l = low
k= 0
while l <= high:
    base[l] = result[k]  # read the result from index k, not l
    l += 1
    k += 1  # increment k as well

这应该按预期工作。请注意,虽然这将正确地进行排序,但这不是一种非常优雅的Python排序方式。首先,您只能对一个全局变量base进行排序,而不是任何列表(将列表作为参数传递会更好)。但是,由于这看起来像是你为学习经历写的主要内容,我会给你留下进一步的改进。