• 算法:快速排序


    参考: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 返回即可。

  • 相关阅读:
    剑指OFFER 连续数组的最大和
    剑指OFFER 两个链表的第一个公共结点
    剑指OFFER 替换空格
    剑指OFFER 二叉树中和为某一值的路径
    剑指OFFER 二叉树的镜像
    剑指OFFER 从上往下打印二叉树
    剑指OFFER 删除链表中重复的结点
    剑指OFFER 数组中只出现一次的数字
    剑指OFFER 调整数组顺序使奇数位于偶数前面
    C 语言 sleep 函数
  • 原文地址:https://www.cnblogs.com/xautxuqiang/p/6425629.html
Copyright © 2020-2023  润新知