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中使用正则表达式的方法
Aug 13 Python
Python2.x与Python3.x的区别
Jan 14 Python
Python用Bottle轻量级框架进行Web开发
Jun 08 Python
python实现多线程抓取知乎用户
Dec 12 Python
对Python闭包与延迟绑定的方法详解
Jan 07 Python
对python 中class与变量的使用方法详解
Jun 26 Python
python中比较两个列表的实例方法
Jul 04 Python
python基于Selenium的web自动化框架
Jul 14 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
Keras搭建自编码器操作
Jul 03 Python
使用Python将语音转换为文本的方法
Aug 10 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
mysql 全文搜索 技巧
2007/04/27 PHP
ThinkPHP之getField详解
2014/06/20 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
页面载入结束自动调用js函数示例
2013/09/23 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
PHP结合jQuery实现的评论顶、踩功能
2015/07/22 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
JavaScript递归算法生成树形菜单
2017/08/15 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
Vue利用History记录上一页面的数据方法实例
2018/11/02 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
python操作excel文件并输出txt文件的实例
2018/07/10 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
11个Python Pandas小技巧让你的工作更高效(附代码实例)
2019/04/30 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
Python用input输入列表的实例代码
2020/02/07 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
感恩寄语大全
2014/04/11 职场文书
2014年酒店服务员工作总结
2014/12/08 职场文书
教师节联欢会主持词
2015/07/04 职场文书
保护地球的宣传语
2015/07/13 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
Python 阶乘详解
2021/10/05 Python
vue自定义右键菜单之全局实现
2022/04/09 Vue.js