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 相关文章推荐
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
python re模块的高级用法详解
Jun 06 Python
Python闭包思想与用法浅析
Dec 27 Python
python mac下安装虚拟环境的图文教程
Apr 12 Python
Python发展史及网络爬虫
Jun 19 Python
python networkx 根据图的权重画图实现
Jul 10 Python
使用Bazel编译TensorBoard教程
Feb 15 Python
如何将PySpark导入Python的放实现(2种)
Apr 26 Python
基于python代码批量处理图片resize
Jun 04 Python
使用Python pip怎么升级pip
Aug 11 Python
python实现简单猜单词游戏
Dec 24 Python
pytorch 使用半精度模型部署的操作
May 24 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代码(星期六,星期日总和)
2009/11/12 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
让textarea自动调整大小的js代码
2011/04/12 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
jquery序列化表单去除指定元素示例代码
2014/04/10 Javascript
jQuery使用之设置元素样式用法实例
2015/01/19 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
Javascript中this关键字指向问题的测试与详解
2017/08/11 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
javascript实现点亮灯泡特效示例
2019/10/15 Javascript
Vue Render函数创建DOM节点代码实例
2020/07/08 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
你不知道的SpringBoot与Vue部署解决方案
2020/11/09 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
[55:45]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.24
2019/09/10 DOTA
python对html过滤处理的方法
2018/10/21 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
美国基督教约会网站:ChristianCafe.com
2020/02/04 全球购物
Java基础类库面试题
2013/09/04 面试题
2015届大学生就业推荐表自我评价
2014/09/27 职场文书
公司离职证明范本
2014/10/17 职场文书
2014年班级工作总结
2014/11/14 职场文书
大学生入党自荐书
2015/03/05 职场文书
食品仓管员岗位职责
2015/04/01 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书