【问题标题】:merge sort implementation to sort by string length - python合并排序实现按字符串长度排序 - python
【发布时间】:2009-07-26 19:50:35
【问题描述】:

我已经在 python 中实现了我认为的合并排序算法。我以前从未在 Python 中编程过,所以我使用了一些资源和一些对我来说似乎很陌生的命令,以获得更好的理解。

但是,我也从来没有实现过归并排序,所以我不确定我是否正确地实现了它。任何指导、提示或更正将不胜感激。

这是我的合并方法:

def merge(left, right):
    result = []
    i, j = 0, 0
    while(i < len(left) and j< len(right)):
        if(len(left[i]) <= len(right[j])): 
            print(i)
            result.append(left[i])
            i=i+1
        else:
            result.append(right[j])
            j=j+1

    result += left[i:]
    result += right[j:]
    return result

同时,这是我的归并排序方法:

def mergesort(list):
    if len(list) < 2:
        return list
    else:
        middle = len(list) / 2
        left = mergesort(list[:middle])
        right = mergesort(list[middle:])
        return merge(left, right)

感谢您提供任何可能的帮助! :)

【问题讨论】:

    标签: python algorithm mergesort


    【解决方案1】:

    不要将变量命名为“列表”。那是 Python 的数组类型的名称,所以使用同名的变量会令人困惑。

    当您从条件返回时,您不需要将函数的其余部分放在 else 块中。

    def mergesort(list):
        if len(list) < 2:
            return list
        middle = len(list) / 2
        left = mergesort(list[:middle])
        right = mergesort(list[middle:])
        return merge(left, right)
    

    总的来说,它看起来很合理。

    当然,除了练习之外,您应该使用 list.sort 或 sorted()。

    a = ["abc", "de", "f", "ghijkl"]
    print sorted(a, lambda a,b: cmp(len(a), len(b)))
    

    【讨论】:

    • 谢谢!我还不知道哪些词是该语言的关键字。我不确定哪个例子更适合学习这门语言,所以我就照着做。感谢您的提示!
    • 但是,我的方法有问题。它似乎只是简单地返回列表的传递方式。我只是调用 mergesort(originalArray) 对其进行排序。这看起来很合理,对吗?
    • 我的错,我叫错了。
    • list(和其他内置类型)实际上不是关键字;如果您愿意,可以使用该名称。最好避免它。如果是关键字(例如 for、def),则会出现编译错误。
    • 请注意,如果您只想对列表进行就地排序,您可以使用 a.sort(...) 而不是 a = sorted(a, ...)。
    【解决方案2】:

    使用sorted() 函数怎么样?像这样:

    def len_cmp(x, y):
        return len(x) - len(y)
    
    my_strings = ["hello", "foo", "bar", "spam"]
    print sorted(my_strings, len_cmp)
    

    【讨论】:

    • 不知道 sorted 函数,谢谢 :) 我在哪里可以找到关于它是如何实现的文档?
    • 你可以在这里找到一个不错的解释:wiki.python.org/moin/HowTo/Sorting 这很方便。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 2015-06-29
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2015-03-15
    • 2018-03-11
    • 2021-12-30
    相关资源
    最近更新 更多