Python实现的数据结构与算法之快速排序详解

作者:RussellLuo 时间:2022-03-03 16:49:17 

本文实例讲述了Python实现的数据结构与算法之快速排序。分享给大家供大家参考。具体分析如下:

一、概述

快速排序(quick sort)是一种分治排序算法。该算法首先 选取 一个划分元素(partition element,有时又称为pivot);接着重排列表将其 划分 为三个部分:left(小于划分元素pivot的部分)、划分元素pivot、right(大于划分元素pivot的部分),此时,划分元素pivot已经在列表的最终位置上;然后分别对left和right两个部分进行 递归排序。

其中,划分元素的 选取 直接影响到快速排序算法的效率,通常选择列表的第一个元素或者中间元素或者最后一个元素作为划分元素,当然也有更复杂的选择方式;划分 过程根据划分元素重排列表,是快速排序算法的关键所在,该过程的原理示意图如下:

<-- 选取划分元素 -->

Python实现的数据结构与算法之快速排序详解

<-- 划分过程 -->

Python实现的数据结构与算法之快速排序详解

<-- 划分结果 -->

Python实现的数据结构与算法之快速排序详解

快速排序算法的优点是:原位排序(只使用很小的辅助栈),平均情况下的时间复杂度为 O(n log n)。快速排序算法的缺点是:它是不稳定的排序算法,最坏情况下的时间复杂度为 O(n2)。

二、Python实现

1、标准实现


#!/usr/bin/env python
# -*- coding: utf-8 -*-
def stdQuicksort(L):
 qsort(L, 0, len(L) - 1)
def qsort(L, first, last):
 if first < last:
   split = partition(L, first, last)
   qsort(L, first, split - 1)
   qsort(L, split + 1, last)
def partition(L, first, last):
 # 选取列表中的第一个元素作为划分元素
 pivot = L[first]
 leftmark = first + 1
 rightmark = last
 while True:
   while L[leftmark] <= pivot:
# 如果列表中存在与划分元素pivot相等的元素,让它位于left部分
    # 以下检测用于划分元素pivot是列表中的最大元素时,
 #防止leftmark越界
     if leftmark == rightmark:
       break
     leftmark += 1
   while L[rightmark] > pivot:
     # 这里不需要检测,划分元素pivot是列表中的最小元素时,
     # rightmark会自动停在first处
     rightmark -= 1
   if leftmark < rightmark:
     # 此时,leftmark处的元素大于pivot,
  #而rightmark处的元素小于等于pivot,交换二者
     L[leftmark], L[rightmark] = L[rightmark], L[leftmark]
   else:
     break
 # 交换first处的划分元素与rightmark处的元素
 L[first], L[rightmark] = L[rightmark], L[first]
 # 返回划分元素pivot的最终位置
 return rightmark

2、Pythonic实现


#!/usr/bin/env python
# -*- coding: utf-8 -*-
def pycQuicksort(L):
 if len(L) <= 1: return L
 return pycQuicksort([x for x in L if x < L[0]]) + \
     [x for x in L if x == L[0]] + \
     pycQuicksort([x for x in L if x > L[0]])

对比 标准实现 可以看出,Pythonic实现 更简洁、更直观、更酷。但需要指出的是,Pythonic实现 使用了Python中的 列表解析 (List Comprehension,也叫列表展开、列表推导),每一次 递归排序 都会产生新的列表,因此失去了快速排序算法本来的 原位排序 的优点。

三、算法测试


#!/usr/bin/env python
# -*- coding: utf-8 -*-
if __name__ == '__main__':
 L = [54, 26, 93, 17, 77, 31, 44, 55, 20]
 M = L[:]
 print('before stdQuicksort: ' + str(L))
 stdQuicksort(L)
 print('after stdQuicksort: ' + str(L))
 print('before pycQuicksort: ' + str(M))
 print('after pycQuicksort: ' + str(pycQuicksort(M)))

运行结果:


$ python testquicksort.py
before stdQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after stdQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]
before pycQuicksort: [54, 26, 93, 17, 77, 31, 44, 55, 20]
after pycQuicksort: [17, 20, 26, 31, 44, 54, 55, 77, 93]

希望本文所述对大家的Python程序设计有所帮助。

标签:Python,快速排序
0
投稿

猜你喜欢

  • 百度UEditor编辑器使用教程与使用方法(图文)

    2023-03-31 14:07:53
  • 如何在CocosCreator中使用JSZip压缩

    2024-04-22 22:16:54
  • python写xml文件的操作实例

    2023-08-09 00:40:39
  • 正则化DropPath/drop_path用法示例(Python实现)

    2022-12-01 21:58:34
  • 详解python tkinter包获取本地绝对路径(以获取图片并展示)

    2022-08-07 07:34:07
  • Django模板语言 Tags使用详解

    2022-09-27 23:37:35
  • ASP设计常见问题及解答精要

    2009-04-21 11:16:00
  • python list 合并连接字符串的方法

    2021-12-18 09:35:30
  • 首页访问感受提升三步曲

    2007-12-13 20:36:00
  • 解决Go语言time包数字与时间相乘的问题

    2023-08-06 17:07:55
  • 学会用Python实现滑雪小游戏,再也不用去北海道啦

    2023-07-05 03:25:11
  • 详解python持久化文件读写

    2023-09-01 15:16:44
  • Python正则表达式中的re.S的作用详解

    2021-12-30 11:54:42
  • Python中range函数的使用方法

    2022-02-07 12:54:12
  • Go利用反射reflect实现获取接口变量信息

    2024-04-26 17:24:25
  • 利用Vue实现一个markdown编辑器实例代码

    2024-04-30 10:39:19
  • python、Matlab求定积分的实现

    2021-08-25 15:43:28
  • Python torch.fft.rfft()函数用法示例代码

    2022-02-15 02:03:36
  • scrapy爬虫完整实例

    2021-06-08 09:34:26
  • Python pygame实现中国象棋单机版源码

    2021-04-15 05:34:16
  • asp之家 网络编程 m.aspxhome.com