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用GET方法上传文件
Mar 10 Python
对于Python装饰器使用的一些建议
Jun 03 Python
python中的闭包函数
Feb 09 Python
python中使用print输出中文的方法
Jul 16 Python
基于tensorflow加载部分层的方法
Jul 26 Python
python3编写ThinkPHP命令执行Getshell的方法
Feb 26 Python
python多线程http压力测试脚本
Jun 25 Python
Python爬虫解析网页的4种方式实例及原理解析
Dec 30 Python
python多线程使用方法实例详解
Dec 30 Python
NumPy排序的实现
Jan 21 Python
python数据分析:关键字提取方式
Feb 24 Python
Scrapy爬虫文件批量运行的实现
Sep 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 calender(日历)二个版本代码示例(解决2038问题)
2013/12/24 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
PHP获取POST数据的几种方法汇总
2015/03/03 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP登录验证码的实现与使用方法
2016/07/07 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
Prototype String对象 学习
2009/07/19 Javascript
javascript 设计模式之单体模式 面向对象学习基础
2010/04/18 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
微信小程序实现带刻度尺滑块功能
2017/03/29 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
Python写入数据到MP3文件中的方法
2015/07/10 Python
python简单商城购物车实例代码
2018/03/15 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Python3.5 Pandas模块之DataFrame用法实例分析
2019/04/23 Python
Python3.5字符串常用操作实例详解
2019/05/01 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
Python爬虫实现的根据分类爬取豆瓣电影信息功能示例
2019/09/15 Python
Python如何获取文件指定行的内容
2020/05/27 Python
基于keras中的回调函数用法说明
2020/06/17 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
ECCO爱步官方旗舰店:丹麦鞋履品牌
2018/01/02 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
有关环保的标语
2014/06/13 职场文书
2015新学期开学寄语
2015/02/26 职场文书
工会积极分子个人总结
2015/03/03 职场文书
大学生活委员竞选稿
2015/11/21 职场文书
创业计划书之零食店(进口)
2019/09/24 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python
前端JS获取URL参数的4种方法总结
2022/04/05 Javascript