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导入oracle数据的方法
Jul 10 Python
python下读取公私钥做加解密实例详解
Mar 29 Python
python3使用smtplib实现发送邮件功能
May 22 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
python xpath获取页面注释的方法
Jan 14 Python
django解决跨域请求的问题详解
Jan 20 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
Python装饰器实现方法及应用场景详解
Mar 26 Python
Django数据库操作之save与update的使用
Apr 01 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
从零开始的TensorFlow+VScode开发环境搭建的步骤(图文)
Aug 31 Python
Python echarts实现数据可视化实例详解
Mar 03 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
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
JQuery each打印JS对象的方法
2013/11/13 Javascript
浅析Node在构建超媒体API中的作用
2014/07/30 Javascript
JS实现倒计时和文字滚动的效果实例
2014/10/29 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
jstree的简单实例
2016/12/01 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Python中List.index()方法的使用教程
2015/05/20 Python
Python实现二分查找算法实例
2015/05/26 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
python实现画圆功能
2018/01/25 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
2018/10/11 Python
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Django 限制访问频率的思路详解
2019/12/24 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
捐款倡议书范文
2014/02/02 职场文书
中学生个人自我评价
2014/02/06 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
会计专业自荐书
2014/07/08 职场文书
初三英语教学计划
2015/01/23 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
Redis批量生成数据的实现
2022/06/05 Redis