我正在尝试一个简单的快速排序。但是,我有两个几乎相同的方法(partition1& partition2)。两者之间的唯一区别是一行代码,特别是在解决方案1中,我在交换后使用i = l
和i+=1
。或者,在解决方案2中,我使用i = l-1
。有人能告诉我他们为什么表现得如此不同?
解决方案1:
def partition1(x, l, r):
tmp = x[r]
i = l
j = l
while j<= r -1:
if x[j] <= tmp:
x[j], x[i] = x[i], x[j]
i+=1
j+=1
x[i+1], x[r] = x[r], x[i+1]
return i+1
解决方案2:
def partition2(x, l, r):
tmp = x[r]
i = l-1
j = l
while j<= r -1:
if x[j] <= tmp:
i+=1
x[j], x[i] = x[i], x[j]
j+=1
x[i+1], x[r] = x[r], x[i+1]
return i+1
实际的排序功能:
def quicksort(x, left, right):
if left < right:
p = partition1(x, left, right)
if left < p:
quicksort(x, left, p-1)
if p < right:
quicksort(x, p+1, right)
arr =[12, 0, 9, 1, 8, 22, 10, 45, 32, 33, 40]
print quicksort(arr, 0, len(arr)-1)
答案 0 :(得分:1)
这是因为,在while
之后,i
位于解决方案2中最后一次交换的位置,但在解决方案1中更进了一步。
要在解决方案1中修复它,您必须将最后两行更改为:
x[i], x[r] = x[r], x[i]
return i