快速排序:
54 26 93 17 77 31 44 55 20
以第一个数为中间数,找一个位置使其左侧的都比其小,右侧的都比其大
方法:
可以看作有两个指针,从两侧往中间移动,如果右侧的指针指向的数字比中间值小,就把他移动到左侧,如果左侧指针指向的数字比中间值大,就将其移动到右侧,一次循环结束后中间值右侧均比其大,左侧均比其小。
二次循环时,把中间值左右两侧各作为一个新序列,均以第一个为中间值再次排序。每次循环都形成两个以中间值为界限分开的两个新序列。经过多次循环最终得出排序完成的序列。
# coding:utf-8
def quick_sort(alist,first,last):
"""快速排序"""
if first >=last:
return
mid_value = alist[first]
low = first
high = last
while low < high:
#high 左移
while low < high and alist[high] >= mid_value:
high = high-1
alist[low] = alist[high]
while low < high and alist[low]< mid_value:
low = low+1
alist[high] = alist[low]
#从循环退出时,low == high
alist[low] = mid_value
#对low左边的序列执行快速排列
quick_sort(alist, first,low-1)
#对low右边序列进行快速排序
quick_sort(alist,low+1,last)
if __name__ =="__main__":
li = [54,26,93,17,77,31,44,55,20]
print(li)
quick_sort(li,0,len(li)-1)
print(li)
因为在一次循环后,分为两个新序列,两个新序列都需要进行排序,所以代码中用到了递归方法。
在二次及多次循环时,应设置好起始位置,即可调用函数,完成循环。