我有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的新手,所以我可能会犯一个相当明显的错误。
答案 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:
稍后在您的代码中,您可以看到您没有定义其他列表,并且您不会返回任何内容。请再次查看我的代码并尝试理解它。您可能会询问有关具体细节的问题,但您真的应该尝试理解它。