PHP 快速排序算法详解
算法原理
快速排序(Quick Sort)是一种高效的排序算法,它的核心思想是分而治之,在序列中选择一个基准元素,将小于基准元素的值放置在基准元素左边,大于基准元素的值放置在基准元素右边,然后再对左右子序列分别执行同样的操作,直到序列有序为止。
具体实现过程如下:
- 选择一个基准元素 $pivot$,可以随机选择一个元素,也可以选择第一个或者最后一个元素。
- 根据基准元素 $pivot$ 将序列拆分成两个子序列,分别是 $[l,pivot-1]$ 和 $[pivot+1,h]$,其中 $l$ 和 $h$ 分别为序列的左右边界。
- 对左右子序列分别执行同样的操作:选取基准元素,将子序列拆分成两个子序列,直到子序列长度为 $1$。
- 递归执行上述操作,直到整个序列有序。
PHP 实现代码
下面给出 PHP 实现快速排序算法的完整代码:
function quickSort(&$arr, $left, $right)
{
if ($left < $right) {
$pivotPosition = partition($arr, $left, $right);
quickSort($arr, $left, $pivotPosition - 1);
quickSort($arr, $pivotPosition + 1, $right);
}
}
function partition(&$arr, $left, $right)
{
$pivot = $arr[$left];
$i = $left + 1;
$j = $right;
while (true) {
while ($i <= $j && $arr[$i] < $pivot) {
$i++;
}
while ($i <= $j && $arr[$j] > $pivot) {
$j--;
}
if ($i > $j) {
break;
} else {
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
$temp = $arr[$left];
$arr[$left] = $arr[$j];
$arr[$j] = $temp;
return $j;
}
在这段代码中,函数 quickSort
实现了快速排序的递归操作,函数 partition
实现了序列分割的过程。
示例说明
下面通过两个示例说明快速排序的具体操作。
示例 1
对序列 $[10, 80, 30, 90, 40, 50, 70]$ 进行快速排序的过程如下:
- 选择第一个元素 $10$ 作为基准元素。
- 遍历序列,将小于 $10$ 的元素放到左侧,大于 $10$ 的元素放到右侧,此时序列变为 $[10, 30, 40, 50, 70, 80, 90]$。
- 在左半边的子序列 $[10, 30, 40, 50, 70]$ 内,选择左侧第一个元素 $10$ 作为基准元素,重复步骤 2。
- 在右半边的子序列 $[80, 90]$ 内,选择左侧第一个元素 $80$ 作为基准元素,重复步骤 2。
- 因为子序列 $[30, 40, 50, 70]$ 已经有序了,所以不需要做任何操作。
- 因为子序列 $[80, 90]$ 已经有序了,所以不需要做任何操作。
- 整个序列有序,排序完成。
示例 2
对序列 $[1,2,3,4,5,6,7]$ 进行快速排序的过程如下:
- 选择第一个元素 $1$ 作为基准元素。
- 遍历序列,将小于 $1$ 的元素放到左侧,大于 $1$ 的元素放到右侧,此时序列变为 $[1, 2, 3, 4, 5, 6, 7]$。
- 在左半边的子序列 $[1, 2, 3, 4, 5, 6, 7]$ 内,选择左侧第一个元素 $1$ 作为基准元素,重复步骤 2。
- 因为子序列 $[1, 2, 3, 4, 5, 6, 7]$ 已经有序了,所以不需要做任何操作。
- 整个序列有序,排序完成。
总结
快速排序是一种高效的排序算法,时间复杂度为 $O(nlogn)$,实现起来也相对简单。在 PHP 中实现快速排序算法,可以帮助开发者在面对数据集合排序问题时,提供更加高效的数据处理能力。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP 快速排序算法详解 - Python技术站