这是我的快速排序代码,partition
函数运行良好,但在调用递归时出现问题。 pos
每次启动函数时都会更改,然后列表限制也会更改。如何解决?
def partition(lst, start, end):
pos=0
if len(lst)<2:
return
for i in range(len(lst[start:end])):
if lst[i] < lst[end]:
lst[i],lst[pos]=lst[pos],lst[i]
pos+=1
elif i==(len(lst[start:end])-1):
lst[end],lst[pos]=lst[pos],lst[end]
return pos
def quick_sort_recursive(lst, start, end):
pos=partition(lst, start, end)
if start<=pos<=end :
quick_sort_recursive(lst, start, pos-1)
quick_sort_recursive(lst, pos+1, end)
else:
return lst
答案 0 :(得分:5)
您的代码中存在许多问题,只有一些修复才能使其正常工作:
def partition(lst, start, end):
pos = start # condition was obsolete, loop won't
# simply run for empty range
for i in range(start, end): # i must be between start and end-1
if lst[i] < lst[end]: # in your version it always goes from 0
lst[i],lst[pos] = lst[pos],lst[i]
pos += 1
lst[pos],lst[end] = lst[end],lst[pos] # you forgot to put the pivot
# back in its place
return pos
def quick_sort_recursive(lst, start, end):
if start < end: # this is enough to end recursion
pos = partition(lst, start, end)
quick_sort_recursive(lst, start, pos - 1)
quick_sort_recursive(lst, pos + 1, end)
# you don't need to return the list
# it's modified in place
示例:
example = [3,45,1,2,34]
quick_sort_recursive(example, 0, len(example) - 1)
print example
给出:
python test.py
[1,2,3,34,45]
答案 1 :(得分:1)
递归Quicksort算法
def quick_sort(array):
if len(array) < 2:
return array
else:
pivot = array[0]
less = quick_sort([i for i in array if i < point])
greater = quick_sort([i for i in array if i > point])
return less + [point] + greater
答案 2 :(得分:0)
快速排序算法的简单示例:
*
### QUICKSORT
A=[44,5,22,0,323,995,94,4,7,15]
def main():
r=len(A)-1
p=0
Result=QuickSort(A,p,r)
print(Result)
def QuickSort(A,p,r):
if p<r:
q=partition(A, p, r)
QuickSort(A, p, q-1)
QuickSort(A, q+1, r)
return A
def partition(A,p,r):
x=A[r]
i=p-1
for j in range(p,r):
if A[j]<=x:
i=i+1
a,b=A.index(A[i]), A.index(A[j])
A[a],A[b]=A[b],A[a]
d,c=A.index(A[i+1]),A.index(A[r])
A[c],A[d]=A[d],A[c]
return i+1
main()
*
答案 3 :(得分:0)
我认为在纯递归实现中,不需要分区aux函数:
def quicksort_recursive(a):
if len(a) == 0:
return a
p = len(a) // 2
l = [i for i in a if i < a[p]]
m = [i for i in a if i == a[p]]
r = [i for i in a if i > a[p]]
return quicksort_recursive(l) + m + quicksort_recursive(r)
答案 4 :(得分:0)
def qsort(array):
if not array:
return []
p, *xs = array
lesser = [x for x in xs if p<x]
greater = [x for x in xs if p>=x]
return qsort(lesser) + [p] + qsort(greater)
qsort([3,-5,3,5,1,7,8,8,-2])
该方法与Luis Sobrecueva并没有太大不同。我会说它的pythonic稍微多一点。
答案 5 :(得分:0)
~Returning recursively the partitions~
def quick_sort(nums):
less = []
equal = []
greater = []
if len(nums) > 1: # array len greater than 1 the exe
pivot = nums[len(nums) // 2] #pivot at mid point
for i in nums:
if i < pivot: less.append(i)
elif i == pivot: equal.append(i)
elif i > pivot: greater.append(i)
return quick_sort(less) + equal + quick_sort(greater)
else:
return nums # else return array