前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >算法系列 | 快速排序

算法系列 | 快速排序

作者头像
佛系编程人
发布2019-08-14 11:35:28
4780
发布2019-08-14 11:35:28
举报
文章被收录于专栏:佛系编程人
快速排序

01

目标

目标: 利用快速排序实现列表里的值从小到大排序

02

流程

流程:

  • 介绍快速排序的基本思想
  • 图例
  • 代码思路
  • 编写函数代码
  • 编写验证代码
  • 运行结果
  • 思考

03

基本思想

基本思想:

在将要排序的序列中任意选取一个值作为基数

然后通过第一次排序把序列分割成两个独立的部分

其中一部分的所有数据都要比基数小

另外一部分的所有数据都要比基数大

再通过递归操作对这两部分的数据重复进行以上操作

以此达到将无序序列变成有序序列的目的

04

图例

图例:

第一次画图,好丑啊

05

代码思路

代码思路:

在这里,我简称快速排序为快排。

根据快排的基本思想,可知快排过程中需要有递归操作,因此我们需要自定义一个函数qsort()用于包装代码

因为经过第一次排序后,我把序列分成三个部分:一部分是比基数小的数据组成的序列,一部分是比基数大的数据组成的序列,还有一部分是基数本身或者跟基数相等的数据组成的序列

为了便于区分这些序列,我这里对这三部分分别建了相应的列表left_base \ equal_base \ right_base,用于存储对应的数据

然后对 left_base 和 right_base 这两部分进行递归处理

最后将这三部分用拼接符“+”进行拼接,最终获取快排后的结果

06

编写代码

编写函数代码:

代码语言:javascript
复制
import random #导入随机模块

def qsort(List): #需传入一个列表参数

  if len(List)>=2: #判断列表里元素的个数,两个或两个以上才有排序的意义

    base = random.choice(List) #随机选取一个基数

    left_base = [] #比基数小的部分

    right_base = [] #比基数大的部分

    equal = [] #跟基数相等部分

    for num in range(len(List)): #遍历列表

      if List[num]<base: #将元素里的值与基数进行判断

        left_base.append(List[num]) #向列表里添加值

      elif List[num]>base:

        right_base.append(List[num])

      else:

        equal.append(List[num])

    return qsort(left_base)+equal+qsort(right_base) #对左右部分进行递归处理并返回快排的最终结果

  else:

    return List #如果列表只有一个值得话,直接返回列表,无需排序

07

验证代码

验证代码:

一个列表里的值可能会出现三种情况:

  • 只有一个值
  • 有两个或两个以上的值
  • 含有多个重复的值

所以下面对这三种情况分别验证

代码语言:javascript
复制
if __name__ == '__main__':

  List = [[2],[2,6,3,7,9,1,5],[2,2,6,6,3,8,1,9]]
  for i in List:
    try:
      result = qsort(i)
      print(result)
      print("排序成功\n")
    except:
      print("排序失败\n")

08

运行结果

运行结果:

09

请思考

请思考:

  • 如何从大到小排列
  • 这段代码还能不能进行优化,减小运行时间复杂度
  • python里有没有什么函数可以帮我们进行排序
  • 除此之外还有什么排序算法,用python该怎么写代码
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 佛系编程人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档