这是我的快速排序算法。非常简单
x = 0
def swap(list, a, b):
temp = list[a]
list[a] = list[b]
list[b] = temp
return list
def quicksort2(list, left, right):
if right > left:
global x
x = x + 1
print x , list, left, right
l = left+1
r = right
while l <= r :
while list[l] < list[left]:
l = l + 1
while list[r] > list[left]:
r = r - 1
if l < r:
list = swap(list, l, r)
list = swap(list, left, r)
list = quicksort2(list, left, r-1);
return quicksort2(list, r+1, right);
return list
但是当我运行我的测试用例时
b = list([1, 2, 2, 3, 4, 5, 6, 12, 6, 32])
quicksort2(b, 0, len(b)-1)
结果是
1 [1, 2, 2, 3, 4, 5, 6, 12, 6, 32] 0 9
2 [1, 2, 2, 3, 4, 5, 6, 12, 6, 32] 1 9
然后停下来...... 任何人都有任何理由......
答案 0 :(得分:0)
您是否尝试在调试器下跟踪程序执行...?
while l <= r
循环永远运行,因为经过几次r
left == 1
l == 2
r == 2
和
l
未递增,因为list[2]
不小于list[1]
r
不再减少,因为list[2]
不大于list[1]
l
不小于r
l
仍然等于r
....... 答案 1 :(得分:0)
我只是简单地修改了你的代码..发现了一些错误,其中一些人已经提到过。剩下的我不会经历。 但是,您不必返回修改后的列表,因为python中的列表始终通过引用传递。
这应该有效:
def quicksort2(list, low, high):
global x
x = x + 1
print x , list, low, high
l = low
r = high
mid = list[(r + l) / 2]
while l <= r:
while list[l] < mid: l += 1
while list[r] > mid: r -= 1
if l <= r:
list[l], list[r] = list[r], list[l] #swap(r,l)
l += 1
r -= 1
if r > low: quicksort2(list, low, r);
if l < high: quicksort2(list, l, high);
if __name__ == '__main__':
x = 0
b = [1, 2, 2, 3, 4, 5, 6, 12, 6, 32]
quicksort2(b, 0, len(b)-1)
print b