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 从远程服务器下载日志文件的程序
Feb 10 Python
Python中的各种装饰器详解
Apr 11 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
Jun 13 Python
Python中生成Epoch的方法
Apr 26 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
Mar 15 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
python实现随机调用一个浏览器打开网页
Apr 21 Python
pytorch 加载(.pth)格式的模型实例
Aug 20 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
python Shapely使用指南详解
Feb 18 Python
django 多数据库及分库实现方式
Apr 01 Python
matplotlib bar()实现百分比堆积柱状图
Feb 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 minixml详解
2008/07/19 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
如何在PHP中读写文件
2020/09/07 PHP
web 页面分页打印的实现
2009/06/22 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
使用javascript实现ListBox左右全选,单选,多选,全请
2013/11/07 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
node.js中的http.response.writeHead方法使用说明
2014/12/14 Javascript
深入分析JSON编码格式提交表单数据
2015/06/25 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
设置jquery UI 控件的大小方法
2016/12/12 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
详解node nvm进行node多版本管理
2017/10/21 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
Python实现在线程里运行scrapy的方法
2015/04/07 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
Python  Django 母版和继承解析
2019/08/09 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
Reformation官网:美国女装品牌
2018/09/14 全球购物
《我的第一本书》教学反思
2014/02/15 职场文书
会计个人实习计划书
2014/08/15 职场文书
员工保密协议书
2014/09/27 职场文书
具结保证书范本
2015/05/11 职场文书
高考升学宴主持词
2019/06/21 职场文书