您的位置:首页 > 其它

排序(二)快速排序

2016-01-16 15:22 134 查看

基本思想

首先要找一个数作为基准数,用于参照比较。所有比基数大的都放在基数的右边,比基数小的都放在基数的左边。

1. 先选择最左端的一项作为
基准数


2. 分别从左端和有段选择一项作为
哨兵i
哨兵j


3.
基准数
在左,在右端的
哨兵j
先动(从右向左,i从坐向右)。

4.
哨兵i
关注小于
基准数
哨兵j
关注大于
基准数


例子代码

a = [9, 4, 7, 3, 1, 5, 8, 6, 2]

def quicksort(left, right):
if left > right:#如果左侧哨兵 比右侧哨兵大,说明在进入递归之前,左侧哨兵比右侧哨兵大
return
tmp = a[left]#获得最左侧元素作为基准数
i = left
j = right
while i != j :
#先从右往左找,关注比基准数小的,如果大于基准数,哨兵j左移(-1),找到了a[j]
while a[j] >= tmp and i < j:
j = j - 1
#如果j找到了比基准数小的数,跳出循环。哨兵i继续找,哨兵i关注比基准数大的,如果小于基准数,哨兵i右移(+1),找到了a[i]
while a[i] <= tmp and i < j:
i = i + 1
#交换两个数(a[i],a[j])在数组中的位置
if i < j:#如果哨兵i和哨兵j没有相遇时
t = a[i]
a[i] = a[j]
a[j] = t
#将基准数归位,左侧都为小于基准数的,右侧都为大于基准数的。
a[left] = a[i]
a[i] = tmp

quicksort(left,i - 1)#基准数左侧的继续排序
quicksort(i + 1, right)#基准数右侧的继续排序
return

if __name__ == '__main__':
print("-------------------- quick sort --------------------")
print(a)
quicksort(0, len(a) - 1)
print(a)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  快速排序