欢迎访问宙启技术站
智能推送

Python函数:如何使用递归实现快速排序?

发布时间:2023-06-14 09:47:09

快速排序,一种高效的排序算法,也是面试中常考的一道题目。它的基本算法思想是:先找出一个参考值,然后把该数组分为两个子数组,其中 个子数组的元素均小于参考值,第二个子数组的元素均大于参考值。然后对这两个子数组分别进行递归调用,重复上述操作,直到数组有序。

快速排序是一种原地排序算法,不需要额外的存储空间,而且它的最优复杂度是O(nlogn)。本篇文章将介绍如何使用递归实现快速排序,帮助读者更好地理解这个算法,提高编程能力。

1. 实现原理

快速排序的实现原理可以分为以下几步:

(1) 选取一个参考值基准值(pivot)。

(2) 在原数组中,把小于等于pivot的元素移到数组左边,大于pivot的元素移到数组右边。

(3) 递归地对左子数组和右子数组进行排序,直到排序完成。

2. 递归实现

使用递归实现的快速排序函数如下:

def quick_sort(arr, l, r):
    if l < r:
        pivot = partition(arr, l, r)
        quick_sort(arr, l, pivot - 1)
        quick_sort(arr, pivot + 1, r)

def partition(arr, l, r):
    pivot = arr[l]
    while l < r:
        while l < r and arr[r] >= pivot:
            r -= 1
        arr[l] = arr[r]
        while l < r and arr[l] <= pivot:
            l += 1
        arr[r] = arr[l]
    arr[l] = pivot
    return l

其中,quick_sort是主函数,partition是分割函数。

在partition函数中,pivot用于保存基准值,首先,把数组的 个元素作为基准值,然后设置两个指针l和r,从左侧和右侧同时开始扫描数组。如果右侧的值大于等于基准值,r指针左移;如果左侧的值小于等于基准值,l指针右移;然后将arr[l]与arr[r]对调。直到l和r相遇,将基准值放到这个位置,并返回l。然后继续递归调用快速排序,处理左、右子数组。

3. 实例演示

下面演示一下使用上述代码实现快速排序的过程。假设我们有一个待排序的数组arr=[5, 3, 8, 4, 2, 7, 1, 10, 6, 9]。运行quick_sort(arr, 0, len(arr) - 1)后,arr数组的排序结果将如下所示:

首先,partition函数将数组分割为两个部分,[1, 3, 2, 4, 5]和[10, 9, 8, 7, 6],并返回基准值的位置l=4。

![](https://p6-tt-ipv6.byteimg.com/origin/pgc-image/1b50a469e3384703b207e924ca205358)

然后,递归地对左右子数组进行排序。对左子数组进行排序,partition函数将数组分割为[1, 2, 3, 4, 5],并返回基准值的位置l=4。

![](https://p9-tt-ipv6.byteimg.com/origin/pgc-image/87998db6677248f891728d50f927ac6b)

对右子数组进行排序,partition函数将数组分割为[6, 7, 8, 9, 10],并返回基准值的位置l=2。

![](https://p6-tt-ipv6.byteimg.com/origin/pgc-image/74ed5b932f624af78b9472d5a9633714)

所以结果应该是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。

4. 总结

快速排序是一种高效的排序算法,使用递归实现可以更加简单和直观,但是注意递归的实现需要注意边界条件和递归停止条件,否则容易导致程序出错。本文介绍了使用递归实现快速排序的详细过程,希望能帮助读者加深理解,提高编程能力。