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中Collection的使用小技巧
Aug 18 Python
python实现ID3决策树算法
Dec 20 Python
Python中支持向量机SVM的使用方法详解
Dec 26 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
python requests post多层字典的方法
Dec 27 Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
pandas实现将日期转换成timestamp
Dec 07 Python
如何通过python实现全排列
Feb 11 Python
Python 生成VOC格式的标签实例
Mar 10 Python
Python中zip函数如何使用
Jun 04 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 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
提问的智慧(2)
2006/10/09 PHP
解决了Ajax、MySQL 和 Zend Framework 的乱码问题
2009/03/03 PHP
ThinkPHP3.1基础知识快速入门
2014/06/19 PHP
orm获取关联表里的属性值
2016/04/17 PHP
PHP读取zip文件的方法示例
2016/11/17 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
js常见表单应用技巧
2008/01/09 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
js由下向上不断上升冒气泡效果实例
2015/05/07 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
vue不通过路由直接获取url中参数的方法示例
2017/08/24 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
Python3实现从文件中读取指定行的方法
2015/05/22 Python
Python中取整的几种方法小结
2017/01/06 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
关于python3中setup.py小概念解析
2019/08/22 Python
Python循环实现n的全排列功能
2019/09/16 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
python 调试冷知识(小结)
2019/11/11 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
python实现视频压缩功能
2020/12/18 Python
优秀教师先进事迹
2014/01/22 职场文书
安全横幅标语
2014/06/09 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书