Python函数:如何使用递归实现快速排序?
快速排序,一种高效的排序算法,也是面试中常考的一道题目。它的基本算法思想是:先找出一个参考值,然后把该数组分为两个子数组,其中 个子数组的元素均小于参考值,第二个子数组的元素均大于参考值。然后对这两个子数组分别进行递归调用,重复上述操作,直到数组有序。
快速排序是一种原地排序算法,不需要额外的存储空间,而且它的最优复杂度是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。

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

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

所以结果应该是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]。
4. 总结
快速排序是一种高效的排序算法,使用递归实现可以更加简单和直观,但是注意递归的实现需要注意边界条件和递归停止条件,否则容易导致程序出错。本文介绍了使用递归实现快速排序的详细过程,希望能帮助读者加深理解,提高编程能力。
