先把代码写出来
def quick_sort(alist, start, end):
if start >= end:
return
low_index = start
high_index = end
flag = alist[start]
while high_index > low_index: #1
while alist[high_index] > flag: #2
high_index -= 1
alist[low_index] = alist[high_index]
while alist[low_index] < flag: #3
low_index += 1
alist[high_index] = alist[low_index]
alist[low_index] = flag
quick_sort(alist, start, low_index-1)
quick_sort(alist, low_index+1, end)
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quick_sort(alist, 0, len(alist)-1)
print(alist)
在第一遍尝试写代码的过程中在上述标注的#1的位置分别出现了一点小问题,现在整理如下:
#1 原本写的条件是high_index != low_index,原本考虑的是排序的最终结果是要确定中位数,也就是flag,的具体位置,在high_index和low_index两个游标相等的时候就可以确定了。但是在循环的过程中,会出现high_index和low_index相等的情况,如果此时又刚好满足#2或者是#3处的条件就会一直执行while下去。就会出现游标一直+=1或者-=1的操作。
这是DEBUG出来的情况
在这里我们不难发现,此时high_index = low_index,所以while里面的+=1会执行,因此出现了high_index > low_index的情况这时候当再不满足的时候就会出现错误,因此上述代码中必须在#2和#3处再额外添加high_index > low_index
的条件束缚,避免出现这种情况。
因为while只是进入循环的条件而不是确保循环过程中始终成立的保证。