python实现快速排序

将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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值