Quicksort的Python实现无法对整个数组进行排序

时间:2014-05-20 18:55:42

标签: python quicksort

我有Quicksort算法的python代码。代码工作正常,直到枢轴右侧的所有元素都大于枢轴,在这种情况下,这些元素保持未分类。

理论上,代码应该排序数组中的所有元素,但在这个阶段我不知道我缺少什么

def swap(array, i, j): 
     temp = array[i]
     array[i] = array[j]
     array[j] = temp

def choosePivotFirstElement(array, left, right):
     return left

def partition(array, pivotIndex, left, right):
      swap(array, pivotIndex, left) #put pivot to the left
      pivot = array[left]
      i = left + 1

     for j in range(left+1, right+1):
           if (array[j] < pivot):
                  swap(array, i, j)
                  i = i + 1
     swap(array, left, i-1) #put pivot back to its place
     return (i-1) #return the position of the pivot

def qsort(array, left, right):
        if ((right - left) < 2):
           return

      pivotIndex = choosePivotFirstElement(array, left, right)
      split = partition(array, pivotIndex, left, right)

      qsort(array, left, split)
      qsort(array, split + 1, right)
      return array

myList = [7,2,5,1,29,6,4,19,11]
sorted = qsort(myList,0,len(myList)-1)
print sorted

这应该返回

[1,2,4,5,6,7,11,19,29]

而是返回

[1,2,4,5,6,7,29,19,11]

我是python的新手,所以我可能会犯一个相当明显的错误。

1 个答案:

答案 0 :(得分:1)

你的代码甚至看起来都不像python代码,你仍然试图从某些东西翻译成python,这不是一个好主意。

通常你会在Python中使用这样的东西:

def quickSort(arr):
    #Leftside
    less = []
    #pivot
    pivotList = []
    #rightside
    more = []
    #if the length of the array is one. then, there is no point in sorting it
    if len(arr) <= 1:
        return arr
    else:
    #sorting :)
        #Defines the pivot as the first element
        pivot = arr[0]
        for i in arr:
            #for each element in the array verify:
            if i < pivot:
                less.append(i)
            elif i > pivot:
                more.append(i)
            else:
                pivotList.append(i)
        #Define the Lists less (left side) and more (right side)
        less = quickSort(less)
        more = quickSort(more)
        #Return the actual array
        return less + pivotList + more

a = [7, 2, 5, 1, 29, 6, 4, 19, 11]
a = quickSort(a)
print a

修改

评论员指出,您的代码中存在多个错误:

你应该没有交换功能,你可以这样做

array[i], array[j] = array[j], array[i]

由于您未在此示例中调用choosePivotLastElement或choosePivotMedianofThree,因此您不应发布它们。在其他问题中,您可以稍后询问具体事项。

请在发布前阅读How to Create a Minimal, Complete and Verifiable Example

范围应为范围(左+ 1,右+ 1):

我的印象是:

if ((right - left) < 2)应该与我在代码中使用的内容类似:if len(array) <= 1:

稍后在您的代码中,您可以看到您没有定义其他列表,并且您不会返回任何内容。请再次查看我的代码并尝试理解它。您可能会询问有关具体细节的问题,但您真的应该尝试理解它。