快速递归算法:快速排序的原理与实现
1. 递归与算法提速
理解递归能够解锁各种新算法,如遍历文件系统或生成变位词。递归也是让代码运行速度大幅提升的关键。在之前我们接触过一些排序算法,像冒泡排序、选择排序和插入排序,但在实际应用中,这些方法很少用于数组排序。大多数计算机语言都为数组提供了内置的排序函数,而其中很多语言底层使用的排序算法就是快速排序(Quicksort)。深入研究快速排序,不仅能让我们了解如何利用递归提升算法速度,还能将这种方法应用到其他实际算法中。
2. 快速排序概述
快速排序是一种极快的排序算法,在平均情况下特别高效。虽然在最坏情况下(如逆序排列的数组),它的性能与插入排序和选择排序相近,但在大多数情况下(即平均情况),它的速度要快得多。快速排序依赖于“分区”(partitioning)的概念,下面我们先来了解分区。
3. 分区(Partitioning)
分区是指从数组中选取一个随机值(称为“基准值”,pivot),然后确保所有小于基准值的数都位于基准值的左侧,所有大于基准值的数都位于基准值的右侧。以下是分区的具体步骤:
1. 左指针持续向右移动一个单元格,直到遇到大于或等于基准值的值,然后停止。
2. 右指针持续向左移动一个单元格,直到遇到小于或等于基准值的值,然后停止。若右指针到达数组开头,也会停止。
3. 右指针停止后,会出现一个转折点。如果左指针已经到达(或超过)右指针,就进入步骤4;否则,交换左指针和右指针所指向的值,然后重复步骤1、2和3。
4. 最后,将基准值与左指针当前指向的值进行交换。
分区完成后,我们可以确保基准值左侧的所有值都小于基准