Python 实现快排

本文详细介绍了快速排序算法,包括其工作原理(通过分治法将数组划分为小规模子数组),关键的partition函数(使用双指针法确定基准值位置),以及quick函数的递归调用过程。特别强调了其为原址排序算法,具有O(nlogn)的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速排序是一种分治算法,它将一个大的数组分成两个较小的子数组:一个子数组的所有元素都小于另一个子数组的所有元素。然后分别对这两个子数组递归地执行快速排序,直到子数组中只有一个元素为止。最后将所有子数组合并以得到排序后的数组。
代码示例如下:

def partition(array, left, right):
    # 以 array[left] 作为基准值
    tmp = array[left]
    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[left] = tmp
    return left


def quick_sort(array):
    quick(array, 0, len(array) - 1)


def quick(array, start, end):
    if start >= end:
        return
    pivot = partition(array, start, end)
    # 对左子数组排序
    quick(array, start, pivot - 1)
    # 对右子数组排序
    quick(array, pivot + 1, end)

array = [3, 6, 8, 10, 1, 2, 1]
quick_sort(array)
print("Sorted array:", array)

具体来说,以上代码实现了如下两个函数:

partition(array, left, right):以array[left]作为基准值来将数组分为两部分,左侧部分的各个元素都小于等于基准值,右侧部分的元素都大于等于基准值。
quick(array, start, end):递归执行快速排序,将数组分成左右两个子数组,并对这两个子数组递归调用quick函数来排序。
quick_sort函数只是一个外部接口,它调用quick函数来进行实际的排序,同时也提供了起始索引和结束索引这两个参数来指定要排序的数组的范围。

partition函数中,代码使用双指针法来实现分区。首先,将array[left]作为基准值tmp。然后,用右指针(right)来搜索小于tmp的元素,搜索到第一个这样的元素时将其移动到左侧,此时右指针移动到左指针(left)的位置。接着用左指针搜索大于tmp的元素,搜索到第一个这样的元素时将其移动到右侧,此时左指针移动到右指针的位置。重复执行这个过程直到左右指针重合,此时数组中间的位置即为基准值正确的位置。最后将基准值放到数组中的正确位置,并返回该位置作为划分的分界点。

quick函数中,首先调用partition函数来分区,得到基准值的位置。然后分别对左侧和右侧的子数组递归调用quick函数,直到子数组只包含一个元素为止。

因为快速排序是一种原址排序(in-place sorting)算法,它只需要常数级别的额外空间,并且它的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn) n n n为要排序的元素个数)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值