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中关于Sequence切片的下标问题详解
Jun 15 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
Python实现正整数分解质因数操作示例
Aug 01 Python
Python对CSV、Excel、txt、dat文件的处理
Sep 18 Python
python3+selenium自动化测试框架详解
Mar 17 Python
对python中的控制条件、循环和跳出详解
Jun 24 Python
解决python文件双击运行秒退的问题
Jun 24 Python
python之array赋值技巧分享
Nov 28 Python
python爬虫使用requests发送post请求示例详解
Aug 05 Python
python的launcher用法知识点总结
Aug 07 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 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的Yii框架的基本使用示例
2015/08/21 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
Yii使用EasyWechat实现小程序获取用户的openID的方法
2020/04/29 PHP
更正确的asp冒泡排序
2007/05/24 Javascript
最佳6款用于移动网站开发的jQuery 图片滑块插件小结
2012/07/20 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
js实现图片从左往右渐变切换效果的方法
2015/02/06 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
js中 计算两个日期间的工作日的简单实例
2016/08/08 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
使用Bootstrap4 + Vue2实现分页查询的示例代码
2017/12/21 Javascript
vue+element-ui+ajax实现一个表格的实例
2018/03/09 Javascript
js实现开关灯效果
2020/03/30 Javascript
Python中的变量和作用域详解
2016/07/13 Python
深入探究Django中的Session与Cookie
2017/07/30 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
浅谈python 线程池threadpool之实现
2017/11/17 Python
使用tensorflow实现AlexNet
2017/11/20 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
Django 日志配置按日期滚动的方法
2019/01/31 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
The Beach People美国:澳洲海滨奢华品牌
2018/07/05 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
自荐信结尾
2013/10/27 职场文书
《自然之道》教学反思
2014/02/11 职场文书
法人代表证明书
2014/09/18 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
出国留学自荐信模板
2015/03/06 职场文书
一般纳税人申请报告
2015/05/18 职场文书
2015年为民办实事工作总结
2015/05/26 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
Python3 如何开启自带http服务
2021/05/18 Python
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python