• Python与快速排序


    这个算法系列主要是自己学习算法过程中动手实践一下,写这个文章作为笔记和分享个人心得,如有错误请各位提出。

    注:转载请说明出处


     问题提出:

    将以下数据升序排列:5, 2, 8, 6, 4, 9, 7, 3, 1


    快速排序的原理:

    快速排序的核心思想是(如下图)

    1.先确定一个基准数,让后按照比较规则,如本例是升序排列,则将比基数大的放到右边,比基数小的放到左边。

    2.接下来各边重复步骤1,直到全部排序完毕。

    程序设计的思路就是(以上面的问题为例)

    左右分别遍历比较

    1 #非程序代码,只用来讲解
    2 
    3 a = [5,2,8,6,4,9,7,3,1]   #数据
    4 temp              #用于保存基数
    5 left              #左起点
    6 right             #右起点
    7 i                 #左游标
    8 j                 #右游标

    1.将第一个数作为基数,temp=a[left], 初始化两个游标 i=left;j=right,(当left大于right时,分类结束)。

    2.先由右边 j 开始遍历(必须要先从右边开始遍历,想想为什么,后面会解答),当遇到比基数小的停下;

       然后左边 i 开始遍历,当遇到比基数大的数停下,当i<j时,交换i和j所在的数a[i], a[j] = a[j],a[i],

       交换完成后,继续遍历直到 i 和 j 相遇。

    3.当i 和 j 相遇,说明一次分类完成,注意此时要将基数和 i,j 相遇时所在的数交换。a[left], a[i]=a[i], a[left]

    4.先处理基数左边的数字,设置左起点为left=left,右起点为right=i-1, 重复1到5步。

    5.当左边的数字处理完成,再处理右边数字,设置左起点为了left=i+1, 右起点为right=right,重复1到5步。 


    接下来为python程序源码:(可以到github上下载https://github.com/DIGCreat/pythonAndAlgorithms.git

     1 #!/usr/bin/env python
     2 # -*- coding:utf8 -*-
     3 '''
     4 简介:本程序主要是用python实现快速排序,程序的功能是实现
     5      升序排列。
     6      本程序在数据量大的情况下,需要注意递归深度的问题。
     7 
     8 作者:King  日期:2016/08/01  版本1
     9 '''
    10 
    11 class QuickSort(object):
    12     '''
    13     self.datas:       要排序的数据列表
    14     _sort():          排序函数
    15     show():           输出结果函数
    16 
    17     用法:
    18     QuickSort(datas)  实例化一个排序对象
    19 
    20     QuickSort(datas)._sort(left, right)
    21                       开始排序,由于排序直接操作
    22                       self.datas, 所以排序结果也
    23                       保存在self.datas中, left为
    24                       排序的开始位置,right为排
    25                       序的结束位置。因此可以实现
    26                       局部排序
    27 
    28     QuickSort(datas).show()  输出结果
    29     '''
    30     def __init__(self, datas):
    31         self.datas = datas
    32 
    33     def _sort(self, left, right):
    34         # 排序函数,由两个游标分别从两端开始遍历
    35         # 左端数据要比基数小,所以判断条件是遇到
    36         # 比基数大的就要停下。
    37         # 右端的情况与左端相反。
    38         #
    39         # 注意:程序一定要先从右端开始遍历,因为
    40         #       两端遍历最终停下的条件肯定是相遇
    41         #       的时候,如果左端先移动,则最后停
    42         #       下时的数值肯定比基数大,若将这个
    43         #       数字与基数交换,则基数左边的数字
    44         #       就不是全部比基数小了,程序运行就
    45         #       不正确了。
    46         if(left > right):
    47             return
    48         temp = self.datas[left]
    49         i = left
    50         j = right
    51         while i != j:
    52             while(self.datas[j] >= temp and i < j):
    53                 j -= 1
    54 
    55             while(self.datas[i] <= temp and i < j):
    56                 i += 1
    57 
    58             if i < j:
    59                 self.datas[i], self.datas[j] = 
    60                         self.datas[j], self.datas[i]
    61 
    62         self.datas[left], self.datas[i] = self.datas[i], temp
    63 
    64         self._sort(left, i-1)
    65         self._sort(i+1, right)
    66 
    67     def show(self):
    68         print 'Result is:',
    69         for i in self.datas:
    70             print i,
    71 
    72         print ''
    73 
    74 if __name__ == '__main__':
    75     try:
    76         datas = raw_input('Please input some number:')
    77         datas = datas.split()
    78         datas = [int(datas[i]) for i in range(len(datas))]
    79     except Exception:
    80         pass
    81 
    82     qs = QuickSort(datas)
    83     qs._sort(0, len(datas)-1)
    84     qs.show()

    最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*

    扫码关注或者搜索微信号:King_diary 

  • 相关阅读:
    樊登读书 增长黑客
    樊登读书 不妥协的谈判
    樊登读书 反脆弱 MD
    樊登读书 思考快与慢
    JS常见的API扩展形式(prototype、jquery、vue插件封装)以及怎样设计出易扩展的表单验证功能?
    [JS设计模式]:策略模式及应用-计算奖金、表单验证的实现(5)
    JS之Math.sin与Math.cos介绍及应用-实现鼠标点击后的烟花效果
    webpack系列-externals配置使用(CDN方式引入JS)
    vue+webpack工程中怎样在vue页面中引入第三方非标准的JS库或者方法
    2-class.com
  • 原文地址:https://www.cnblogs.com/king-ding/p/quicksort.html
Copyright © 2020-2023  润新知