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标准库内置函数complex介绍
Nov 25 Python
从Python程序中访问Java类的简单示例
Apr 20 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
把csv文件转化为数组及数组的切片方法
Jul 04 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
python多任务及返回值的处理方法
Jan 22 Python
django+tornado实现实时查看远程日志的方法
Aug 12 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
如何基于Python实现数字类型转换
Feb 07 Python
Python接口测试get请求过程详解
Feb 28 Python
5行Python代码实现图像分割的步骤详解
May 25 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 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中header的用法详解
2013/06/07 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
PHP实现根据银行卡号判断银行
2015/04/29 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
js 动态修改css文件用到了cssRule
2014/08/20 Javascript
javascript实用方法总结
2015/02/06 Javascript
JavaScript中诡异的delete操作符
2015/03/12 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
Bootstrap table两种分页示例
2016/12/23 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
Vue实战之vue登录验证的实现代码
2017/10/31 Javascript
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
Angular8路由守卫原理和使用方法
2019/08/29 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python实现定时任务
2017/02/08 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
Django中的cookie和session
2019/08/27 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
2020/03/13 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
老师对学生的寄语
2014/04/09 职场文书
保密协议书范本
2014/04/22 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
图解排序算法之希尔排序Java实现
2021/06/26 Java/Android
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers