快速排序python实现

在看《编写高质量代码——改善python程序的91个建议》一书时,看到第一页提到了快速排序算法。特地学习一下。

一、快速排序简介

快速排序(Quick Sort)是一种效率很高的排序算法,是对冒泡排序的一种改进排序算法。

快速排序首先任意选取一个数据(通常选待排序列表中的第一个数)作为基准数据,将待排序列表中的数据分割成独立的两部分,所有比基准数据小的数都放到它左边,所有比基准数据大的数都放到它右边,此时基准数据排序完成,第一轮快速排序完成。然后再按此方法对两部分的数据分别进行快速排序,整个排序过程可以递归进行,直到被分割的数据只有一个或零个时,递归结束,列表排序完成。

快速排序的名字起得简单直接,因为这种排序算法速度快,效率高,是处理大数据最快的排序算法之一。

二、快速排序原理

快速排序的原理如下:

  1. 从待排序列表中选取一个基准数据(通常选取第一个数据)。

  2. 将待排序列表中所有比基准数据小的元素都放到基准数据左边,所有比基准数据大的元素都放到基准数据右边(升序排列,降序反之)。用基准数据进行分割操作后,基准数据的位置就是它最终排序完成的位置,第一轮排序完成。

  3. 递归地对左右两个部分的数据进行快速排序。即在每个子列表中,选取基准,分割数据。直到被分割的数据只有一个或零个时,列表排序完成。

伪代码

function quicksort('array')
    if length('array')1
        return 'array' // 显然,0个或1个元素的数组是已经排好顺序的,也就是无需排序
    select and remove a pivot element 'pivot' from 'array' // see 'Choice of pivot' below
    create empty lists 'less' and 'greater'
    for each 'x' in 'array'
        if 'x''pivot'
            then append 'x' to 'less'
        else
            append 'x' to 'greater'
    return concatenate(quicksort('less'), list('pivot'), quicksort('greater'))
    // 2个递归调用

伪代码中文翻译版

function quicksort(数组)  
    如果 数组的长度 ≤ 1  
        返回 数组 // 显然,0个或1个元素的数组是已经排好顺序的,也就是无需排序  
    从 数组中 选择并移除 一个基准元素 pivot  
    // 关于基准元素的选择,下面会有说明(注意:这部分在伪代码中通常不展开具体实现)  
    创建空列表 less 和 greater  
    对于 数组 中的每个 元素x  
        如果 元素x ≤ pivot  
            则 将 元素x 添加到 less 列表中  
        否则  
            将 元素x 添加到 greater 列表中
    
    // 此处把less列表, 只包含pivot的单元素列表 和 greater列表合并起来 
    最终列表=concatenate(quicksort('less'), list('pivot'), quicksort('greater'))

    返回 最终列表

python快速排序算法实现

def quicksort(to_be_sorted_list):
    """
    对列表进行快速排序.

    Args:
        to_be_sorted_list (list): 需要排序的列表.

    Returns:
        list: 排序后的列表.

    使用快速排序算法对列表进行排序.该算法通过选取一个基准元素(pivot),将列表分为两部分:小于等于基准的元素和大于基准的元素,
    然后递归地对这两部分进行相同的操作,直到列表被完全排序.
    """
    if len(to_be_sorted_list) <= 1:
        # 如果列表为空或只包含一个元素,则无需排序,直接返回.
        return to_be_sorted_list

    pivot = to_be_sorted_list[0]
    # 创建两个空列表,用于存储小于等于基准的元素和大于基准的元素.
    less = []
    greater = []

    # 遍历列表(从第二个元素开始,以避免重复处理基准元素).
    for x in to_be_sorted_list[1:]:
        if x <= pivot:
            less.append(x)
        else:
            greater.append(x)

    # 递归地对小于等于基准的列表和大于基准的列表进行排序.
    # 然后将排序后的列表与基准元素合并.
    result = quicksort(less)
    result.append(pivot)
    
    # extend直接在列表末尾添加元素
    # 列表加法在Python中实际上是创建了一个全新的列表,
    # 并将所有元素从原始列表中复制过来,这在处理大数据集时可能会非常耗时.
    result.extend(quicksort(greater))

    # 返回排序后的列表.
    return result

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值