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 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
python实现bucket排序算法实例分析
May 04 Python
python设计模式大全
Jun 27 Python
python 队列详解及实例代码
Oct 18 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
从训练好的tensorflow模型中打印训练变量实例
Jan 20 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
Feb 28 Python
iPython pylab模式启动方式
Apr 24 Python
能让Python提速超40倍的神器Cython详解
Jun 24 Python
Python进程池与进程锁之语法学习
Apr 11 Python
python读取mat文件生成h5文件的实现
Jul 15 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
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
php Calender(日历)代码分享
2014/01/03 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
PHP中error_log()函数的使用方法
2015/01/20 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
原生JS轮播图插件
2017/02/09 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
Python实现监控程序执行时间并将其写入日志的方法
2015/06/30 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
详解Python循环作用域与闭包
2019/03/21 Python
python实现logistic分类算法代码
2020/02/28 Python
python如何调用百度识图api
2020/09/29 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
教学实习自我评价
2014/01/28 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
项目合作意向书范本
2014/04/01 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
经费申请报告范文
2015/05/18 职场文书
恰同学少年观后感
2015/06/08 职场文书
企业愿景口号
2015/12/25 职场文书
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL