2014-02-24 201 views
-3

下面为quicksort编写的代码没有正确排序列表。代码中必然存在一些逻辑缺陷。任何人都可以查看代码吗?python中的快速排序

def quicksort(aList, start, last): 
    i = start + 1 
    j = start + 1 
    pivot = aList[start] 
    while j <= last and pivot > aList[j]: 
     if pivot > aList[j]: 
      temp = aList[i] 
      aList[i] = aList[j] 
      aList[j] = temp 
      i = i + 1 
     j = j + 1 

    temp = aList[start] 
    aList[start] = aList[i-1] 
    aList[i-1] = temp 
    if i - start > 2: 
     quicksort(aList, start, i-2) 
    if last - i > 0: 
     quicksort(aList, i, last) 


aList = [2, 5, 3, 95, 68, 75, 29, 52] 
quicksort(aList, 0, len(aList)-1) 
print aList 
+3

请告诉我们什么是错的。你期望什么,你的代码的结果是什么? – 2014-02-24 11:15:31

+1

这里有一个提示可以帮助你找出错误的地方:在说'temp = aList [start]' – mbatchkarov

+1

的行之前加上'print aList'另外,看看[PEP-8(Python代码样式指南) ](http://www.python.org/dev/peps/pep-0008/) - 不要使用制表符缩进 - 每个级别使用四个空格。在运算符周围使用空格。避免不必要的括号。并且了解元组打包和解包:'alist [i],alist [j] = alist [j],alist [i]'更酷。 –

回答

1
def quicksort(aList, start, last): 
    i = start + 1 
    j = start + 1 
    pivot = aList[start] 
    while j <= last: 
    if pivot > aList[j]: 
     temp = aList[i] 
     aList[i] = aList[j] 
     aList[j] = temp 
     i = i + 1 
    j = j + 1 

    temp = aList[start] 
    aList[start] = aList[i-1] 
    aList[i-1] = temp 
    if i - start > 2: 
    quicksort(aList, start, i-2) 
    if last - i > 0: 
    quicksort(aList, i, last) 

试试这个!

yopy给出了另一个版本的快速排序。

快速排序的关键是选择枢轴,在你的代码中枢轴是数组的第一个元素,为了获得更好的平均性能,你可以随机选择枢轴。

0

请检查:

def quicksort(aList, start, last): 
    i = start + 1 
    j = last 
    pivot = aList[start] 
    while i <= j: 
     if pivot > aList[j]: 
      aList[i], aList[j] = aList[j], aList[i] 
      i = i + 1 
     elif pivot < aList[j]: 
      j = j - 1 

    aList[start], aList[i-1] = aList[i-1], aList[start] 

    if i - start > 2: 
     quicksort(aList, start, i-2) 
    if last - i > 0: 
     quicksort(aList, i, last) 


aList = [2, 5, 3, 95, 68, 75, 29, 52] 
quicksort(aList, 0, len(aList)-1) 
print aList 

输出:

[2, 3, 5, 29, 52, 68, 75, 95] 
+0

这工作..虽然我用了不同的逻辑。我和j都增量增长,不像ur的代码,j减少,我增加.. – Arighna

+0

为什么在'i <= j'循环内检查if语句中的'i <= j?它看起来总是会变成真实的,或者我错过了什么? – alexwlchan

+0

删除谢谢,它是多余的。我正在修复该片段,并忘记将其删除。 –