首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pythonic快速排序算法

Pythonic快速排序算法
EN

Code Review用户
提问于 2014-09-24 15:59:46
回答 2查看 861关注 0票数 7

我的快速有效的,就地的,奏鸣曲吗?

代码语言:javascript
复制
def quicksort(array, lo, hi):
    if hi - lo < 2:
        return
    key = random.randrange(lo, hi)
    array[key], array[lo] = array[lo], array[key]
    y = 1 + lo
    for x in xrange(lo + 1, hi):
        if array[x] <= array[lo]:
            array[x], array[y] = array[y], array[x]
            y += 1
    array[lo], array[y - 1] = array[y - 1], array[lo]
    quicksort(array, lo, y - 1)
    quicksort(array, y, hi)


a = map(int, raw_input().split())
quicksort(a, 0, len(a))
EN

回答 2

Code Review用户

回答已采纳

发布于 2014-09-24 20:54:32

考虑一下您的分区方法

代码语言:javascript
复制
for x in xrange(lo + 1, hi):
    if array[x] <= array[lo]:
        array[x], array[y] = array[y], array[x]
        y += 1

抽象化出来,看上去就像这样。

代码语言:javascript
复制
def partition(array, lo, hi, pivot):
    y = lo
    for x in xrange(lo, hi):
        if array[x] <= pivot:
            array[x], array[y] = array[y], array[x]
            y += 1
    return y

# eg
pivot = partition(array, lo + 1, hi, array[lo])
array[lo], array[pivot] = array[pivot], array[lo]

我觉得这是一种奇怪的分区方法。这不是我学到的,但它更简单,似乎很有效。在搜索示例时,我遇到了关于cs.exchange的这个问题。您应该阅读非常详细的答案,并考虑使用Hoare分区,因为它总是略显效率。

另外,您应该考虑实现一个单独的交换方法。你使用的成语非常好,它只是变得冗长,而且你经常使用它。

代码语言:javascript
复制
def swap_indexes(array, a, b):
    array[a], array[b] = array[b], array[a]
票数 3
EN

Code Review用户

发布于 2014-09-24 18:05:17

总的来说看起来不错。很少有评论。

  • 失踪的import random
  • 随机枢轴选择只是许多可能的策略之一。根据数据的性质,这可能是一个很好的策略,也可能不是一个好的策略。只有客户知道什么是合适的策略,让他选择吧。
  • 没有原始循环咒语:每个循环可能代表一个算法,通常是非常重要的本身。在这种情况下,算法是partition。它本身的作用是值得考虑的。
票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/63764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档