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中字符编码简介、方法及使用建议
Jan 08 Python
详解Python中的装饰器、闭包和functools的教程
Apr 02 Python
Python NumPy库安装使用笔记
May 18 Python
Python文件处理
Feb 29 Python
python的dataframe和matrix的互换方法
Apr 11 Python
python贪吃蛇游戏代码
Apr 18 Python
python十进制转二进制的详解
Feb 07 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
Python实现播放和录制声音的功能
Aug 12 Python
Django mysqlclient安装和使用详解
Sep 17 Python
Python3.9.1中使用match方法详解
Feb 08 Python
Python字符串常规操作小结
Apr 03 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
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/03/02 无线电
终于听上了直流胆调频
2021/03/02 无线电
PHP通用分页类page.php[仿google分页]
2008/08/31 PHP
php auth_http类库进行身份效验
2009/03/19 PHP
PHP开发规范手册之PHP代码规范详解
2011/01/13 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
Javascript节点关系实例分析
2015/05/15 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
vue路由教程之静态路由
2019/09/03 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
2020/12/08 Vue.js
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
基于Python的身份证号码自动生成程序
2014/08/15 Python
Python面向对象编程中的类和对象学习教程
2015/03/30 Python
Python实现字典按照value进行排序的方法分析
2017/12/23 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
python读取文本中的坐标方法
2018/10/14 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
Python 合并拼接字符串的方法
2020/07/28 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
HTML5实现分享到微信好友朋友圈QQ好友QQ空间微博二维码功能
2018/01/03 HTML / CSS
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
集团公司总经理岗位职责
2013/12/20 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
公务员个人年终总结
2015/02/12 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
人事任命通知书
2015/04/21 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
父亲去世追悼词
2015/06/23 职场文书
创业计划书之牛肉汤快餐店
2019/10/08 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
Python内置数据结构列表与元组示例详解
2021/08/04 Python