算法:快速排序

参考:http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html

   http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/

 

 1 def quick_sort(ary):
 2         return qsort(ary, 0, len(ary)-1)
 3 
 4 def qsort(ary, left, right):
 5         if left >= right:
 6                 return
 7         temp = ary[left]
 8         lp = left
 9         rp = right
10         while lp < rp:
11                 while ary[rp] >= temp and lp < rp:
12                         rp -= 1
13                 while ary[lp] <= temp and lp < rp:
14                         lp += 1
15                 ary[lp], ary[rp] = ary[rp], ary[lp]
16         ary[left], ary[lp] = ary[lp], ary[left]
17         qsort(ary, left, lp-1)
18         qsort(ary, rp+1, right)
19         return ary
20 
21 
22 if __name__ == '__main__':
23         a = [1,5,4,8,7,2,3,9,4,5,7]
24         print(quick_sort(a))

 

算法步骤:

  1. 从数列中挑出一个元素作为基准数。
  2. 分区过程,将比基准数大的放到右边,小于或等于它的数都放到左边。
  3. 再对左右区间递归执行第二步,直至各区间只有一个数。

 

代码解释:

while lp < rp:
                 while ary[rp] >= temp and lp < rp:
                         rp -= 1
                 while ary[lp] <= temp and lp < rp:
                         lp += 1
                 ary[lp], ary[rp] = ary[rp], ary[lp]

ary[left], ary[lp] = ary[lp], ary[left]

 

举例:

5 4 7 1 9 2 4 8

在这里取 5 为基准数, 从右往左扫描,当遇到比5小的数就停下(遇到4停下)。从左向右扫描,当遇到比5大的数就停下(遇到7停下)。

然后交换这两个数,则原数组变为 5 4 4 1 9 2 7 8。此时 lp 指向4, rp 指向7。

再次从右往左扫描,当遇到比5小的数就停下(遇到2停下)。从左向右扫描,当遇到比5大的数就停下(遇到9停下)。

然后交换这两个数,则原数组变为 5 4 4 1 2 9 7 8.此时 lp 指向2, rp 指向9.

再次从右往左扫面,rp -1 == lp。此时lp rp相等。此while lp < rp 循环结束。

数组为 5 4 4 1 2 9 7 8

交换基准数和刚才 lp == rp 的位置的数。ary[left], ary[lp] = ary[lp], ary[left]

数组变为 2 4 4 1 5 9 7 8 。

再将数组分为 2 4 4 1 和 9 7 8 两个数组分别处理。

这里采用的分治和递归方法。基本条件为:if left >= right:  return

 

代码解释:

  if left >= right:  return

  举例:当截取的数组中只有两个元素 [8,6] 的时候,qsort(ary, 0, -1) 和 qsort(ary, 1,1),

  所以当 left >= right 时候, 就不对数组元素进行修改,直接 return 返回即可。

 

posted @ 2017-02-21 18:41  小黄人python  阅读(158)  评论(0编辑  收藏  举报