将a = [3, 5, 2, 4, 6, 7, 1, 8]元素从小到大排列。
排序过程:
第一轮排序:
1、选取a[0]作为基准数,p=a[0]
2、i = 0,l = len(a)-1(即为7)
3、从a数组右边向左寻找第一个比p小的数,然后将其与p互换位置,符合比准数小的数放置在基准数一边的原则,此时找到的是1,互换位置后,结果为:
a = [1, 5, 2, 4, 6, 7, 3, 8]
此时,i=0,j=6
4、从a数组左边向右寻找第一个比p大的数,然后将其与p互换位置,符合比基准数大的数放置在基准数一边的原则,此时找到的是5,互换位置后,结果为:
a = [1, 3, 2, 4, 6, 7, 5, 8]
此时,i=1,j=6
5、从a数组右边向左寻找第一个比p小的数,然后将其与p互换位置,符合比基准数小的数放置在基准数一边的原则,此时找到的是2,互换位置后,结果为:
a = [1, 2, 3, 4, 6, 7, 5, 8]
此时,i=1,j=2
6、继续从a数组左边向右寻找第一个比p大的数,但是,当i==j时,第一轮排序便结束,可以看到,此时基准数p=3的左边全是比3小的数,右边全是比3大数,第一轮排序结束
a = [1, 2, 3, 4, 6, 7, 5, 8]
第二、三、四……轮排序:
将a数组分为两部分,对子数组继续使用上述策略排序,分而治之,直至最终a数组所有元素从小到大排列。
排序要点:
1、选取基准数,不一定是第一个元素。
2、分而治之,最后,再合之。
代码实现:
# -*- coding: UTF-8 -*-
def swap(arr, ind1, ind2):
tmp = arr[ind1]
arr[ind1] = arr[ind2]
arr[ind2] = tmp
def qs(arr):
# arr为[]或只有一个元素,无需排序,直接返回
if len(arr) <= 1:
return arr
i = 0
j = len(arr)-1
p = arr[i]
flag = True # 第一轮从右至左
while i != j:
# 从右至左,寻找第一个比p小的数
if flag == True and arr[j] < p:
flag = False
swap(arr, j, arr.index(p))
continue
# 从左至右,寻找第一个比p大的数
if flag == False and arr[i] >= p:
flag = True
swap(arr, i, arr.index(p))
continue
if flag == True:
j = j - 1
else:
i = i + 1
return qs(arr[:i]) + [p] + qs(arr[i+1:])
print qs([3, 5, 2, 4, 6, 7, 1, 8])
# python list索引:
# a = [1, 2, 4]
# a[:0]为[]
# a[:1]为1
# a[begin : count]为a[begin], a[begin + 1], ..., a[begin + count - 1]
参考:http://blog.csdn.net/morewindows/article/details/6684558