python快速排序的实现及运行时间比较


Posted in Python onNovember 22, 2019

快速排序的基本思想:首先选定一个数组中的一个初始值,将数组中比该值小的放在左边,比该值大的放在右边,然后分别对左边的数组进行如上的操作,对右边的数组进行如上的操作。(分治+递归)

1.利用匿名函数lambda

匿名函数的基本用法func_name  = lambda x:array,冒号左边的x代表传入的参数,冒号右边的array代表返回值,当然名字是可以自己取的。

quick_sort = lambda array: \
  array if len(array) <= 1 \
    else quick_sort([item for item in array[1:] if item <= array[0]]) \
       + [array[0]] + \
       quick_sort([item for item in array[1:] if item > array[0]])

2.将匿名函数拆解封装为函数

def func2(array):
  if len(array)<=1:
    return array
  tmp = array[0]
  left = [x for x in array[1:] if x<=tmp]
  right = [x for x in array[1:] if x>tmp]
  return func2(left) + [tmp] + func2(right)

3.网上常见的

def func2(array,left,right):
  if left>=right:
    return
  low=left
  high=right
  tmp=array[low]
  while left<right:
    while left<right and array[right]>tmp:
      right-=1
    array[left] = array[right]
    while left<right and array[left]<=tmp:
      left+=1
    array[right]=array[left]
  array[right]=tmp
  func2(array,low,left-1)
  func2(array,left+1,high)

4.算法导论里面的

def func3(array, l, r):
  if l < r:
    q = partition(array, l, r)
    func3(array, l, q - 1)
    func3(array, q + 1, r)
def partition(array, l, r):
  x = array[r]
  i = l - 1
  for j in range(l, r):
    if array[j] <= x:
      i += 1
      array[i], array[j] = array[j], array[i]
  array[i + 1], array[r] = array[r], array[i + 1]
  return i + 1

5.利用栈实现非递归版本

def func4(array, l, r):
  if l >= r:
    return
  stack = []
  stack.append(l)
  stack.append(r)
  while stack:
    low = stack.pop(0)
    high = stack.pop(0)
    if high - low <= 0:
      continue
    x = array[high]
    i = low - 1
    for j in range(low, high):
      if array[j] <= x:
        i += 1
        array[i], array[j] = array[j], array[i]
    array[i + 1], array[high] = array[high], array[i + 1]
    stack.extend([low, i, i + 2, high])

6.python内置的

sorted(array)

本来是想利用装饰器来测一下每个函数的运行时间的,但是由于快排里面存在递归,使用装饰器会报错,就只好一个个计算了。这里还是贴一下用装饰器计算时间的代码:

def count_time(func):
  @wraps(func)
  def helper(func,*args,**kwargs):
    start=time()
    result = func(*args,**kwargs)
    end=time()
    print("函数:", func.__name__, "运行时间:", round(end - start, 4), "s")
    return result
  return helper

这里我们的输入是随机生成的在0-100间的整数,我们测试一下在不同数量下的消耗时间:

from functools import wraps
from random import randint
from time import time
func1_start =time()
res = quick_sort(array)
func1_end =time()
print("函数:func1 运行时间:", round(func1_end - func1_start, 4), "s")
func2_start =time()
func2(array)
func2_end =time()
print("函数:func2 运行时间:", round(func2_end - func2_start, 4), "s")
func3_start =time()
func3(array,0,len(array)-1)
func3_end =time()
print("函数:func3 运行时间:", round(func3_end - func3_start, 4), "s")
func4_start =time()
func4(array,0,len(array)-1)
func4_end =time()
print("函数:func4 运行时间:", round(func4_end - func4_start, 4), "s")
func5_start =time()
func5(array,0,len(array)-1)
func5_end =time()
print("函数:func5 运行时间:", round(func5_end - func5_start, 4), "s")
func6_start =time()
sorted(array)
func6_end =time()
print("函数:func6 运行时间:", round(func6_end - func6_start, 4), "s")

输入array的定义:

array = [randint(0,100) for i in range(5000)]

需要注意的是,随着数据量的增加,方法4,也就是算法导论中的会出现以下问题:

python快速排序的实现及运行时间比较

 这是因为python中的递归深度是有一定限制的,可以使用如下方法暂时解决该问题:

import sys
sys.setrecursionlimit(100000)

同时,方法4还会出现内存溢出问题,方法4也太坑了。

python快速排序的实现及运行时间比较

 最后对比一下这些方法消耗的时间:

python快速排序的实现及运行时间比较

 总结:

方法一、方法二速度较快,同时也较好理解,想要学会快速排序,只要记住方法二即可;

python内置的排序速度还是最快的呀;

以上所述是小编给大家介绍的python快速排序的实现及运行时间比较,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
跟老齐学Python之有容乃大的list(3)
Sep 15 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
使用py2exe在Windows下将Python程序转为exe文件
Mar 04 Python
详解python实现读取邮件数据并下载附件的实例
Aug 03 Python
pyhton列表转换为数组的实例
Apr 04 Python
python画图把时间作为横坐标的方法
Jul 07 Python
pyinstaller打包程序exe踩过的坑
Nov 19 Python
解决pycharm最左侧Tool Buttons显示不全的问题
Dec 17 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
Oct 18 Python
Pytorch 中的optimizer使用说明
Mar 03 Python
详解MindSpore自定义模型损失函数
Jun 30 Python
Python实现平行坐标图的绘制(plotly)方式
Nov 22 #Python
Python Celery多队列配置代码实例
Nov 22 #Python
python 协程 gevent原理与用法分析
Nov 22 #Python
python 并发下载器实现方法示例
Nov 22 #Python
使用python绘制二维图形示例
Nov 22 #Python
python将邻接矩阵输出成图的实现
Nov 21 #Python
python实现小世界网络生成
Nov 21 #Python
You might like
php中判断一个字符串包含另一个字符串的方法
2007/03/19 PHP
php flush类输出缓冲剖析
2008/10/19 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
javascript 变量作用域 代码分析
2009/06/26 Javascript
Jquery插件 easyUI属性汇总
2011/01/19 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
JavaScript程序中的流程控制语句用法总结
2016/05/23 Javascript
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
vue实现循环切换动画
2018/10/17 Javascript
layui数据表格重载实现往后台传参
2019/11/15 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
Python内置函数dir详解
2015/04/14 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
python 全文检索引擎详解
2017/04/25 Python
机器学习python实战之决策树
2017/11/01 Python
python微信跳一跳系列之棋子定位像素遍历
2018/02/26 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
python自动化工具之pywinauto实例详解
2019/08/26 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
python实现贪吃蛇双人大战
2020/04/18 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
Python实现小黑屋游戏的完整实例
2021/01/06 Python
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
护士实习生自我鉴定范文
2013/12/10 职场文书
前台文员职责范本
2014/03/07 职场文书
重阳节活动总结
2014/08/27 职场文书
办公室禁烟通知
2015/04/23 职场文书
商务信函英语问候语
2015/11/10 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers
Python爬虫入门案例之回车桌面壁纸网美女图片采集
2021/10/16 Python
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android