我写了一个快速排序代码。除了一个元素保持未排序外,它工作正常。我试过调试但是徒劳无功。你能帮我找一下潜在的错误。
这是代码。
def qsort(l,start,end):
if start >= end :
return
i,j = start, end
pivot = (start + (end - start)/2)
while i<=j:
while(l[i] < l[pivot]):
i+=1
while(l[j] > l[pivot]):
j-=1
if(i<=j):
l[i],l[j] = l[j],l[i]
i+=1
j-=1
qsort(l,start,j)
qsort(l,i,end)
return l
a = [67,89,45,23,15,19,1,14,100]
print qsort(a,0,len(a)-1)
上述代码的输出为[1,14,15,23,19,45,67,89,100]。出于某种原因,23和19的位置不会互换。
但是如果我选择一个带有pivot = random.randint(fst,lst)语句的随机数据集,我会得到一个完全排序的列表。有人可以解释一下这个原因吗?
答案 0 :(得分:0)
在尝试理解您自己的参考实现时,您可能会发现这些参考实现很有用。
返回新列表:
def qsort(array):
if len(array) < 2:
return array
head, *tail = array
less = qsort([i for i in tail if i < head])
more = qsort([i for i in tail if i >= head])
return less + [head] + more
对列表进行排序:
def quicksort(array):
_quicksort(array, 0, len(array) - 1)
def _quicksort(array, start, stop):
if stop - start > 0:
pivot, left, right = array[start], start, stop
while left <= right:
while array[left] < pivot:
left += 1
while array[right] > pivot:
right -= 1
if left <= right:
array[left], array[right] = array[right], array[left]
left += 1
right -= 1
_quicksort(array, start, right)
_quicksort(array, left, stop)
从可迭代中生成已排序的项目:
def qsort(sequence):
iterator = iter(sequence)
head = next(iterator)
try:
tail, more = chain(next(iterator), iterator), []
yield from qsort(split(head, tail, more))
yield head
yield from qsort(more)
except StopIteration:
yield head
def chain(head, iterator):
yield head
yield from iterator
def split(head, tail, more):
for item in tail:
if item < head:
yield item
else:
more.append(item)