下面是对PHP两种快速排序算法实例的详细讲解:
1. 快速排序算法介绍
快速排序属于交换排序的一种,是目前应用最广泛的排序算法之一,也是学习算法的重要内容。快速排序算法的基本思想是通过将待排序序列进行划分,并不断递归对子序列进行排序,完成整个序列的排序。
快速排序的基本步骤如下:
-
选择一个基准值(pivot)。
-
将待排序数组中小于基准值的元素移动到数组左侧,大于基准值的元素移动到数组右侧。
-
然后对左右两边的子序列进行递归调用快速排序。
-
重复步骤2-3,直到子序列长度为1或0停止递归。
2. 快速排序算法示例
下面将分别给出两种不同的PHP实现快速排序算法的示例,希望能为大家更好地理解快速排序算法提供帮助。
2.1 示例1
示例1中使用了递归实现的快速排序算法,程序如下:
function quick_sort($arr)
{
if (count($arr) <= 1) {
return $arr;
}
$pivot = $arr[0];
$left = $right = array();
for ($i = 1; $i < count($arr); $i++) {
if ($arr[$i] < $pivot) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
return array_merge(quick_sort($left), array($pivot), quick_sort($right));
}
$arr = array(5, 3, 8, 2, 9, 1, 7);
echo "<pre>";
print_r(quick_sort($arr));
echo "</pre>";
上面的示例1中,实现了一个名为quick_sort的函数,其中:
-
首先判断将要排序的数组长度是否小于等于1,如果是,则直接返回。
-
取一个基准值(数组第一个元素),将所有小于基准值的元素放到left数组中,将所有大于等于基准值的元素放到right数组中。
-
递归调用quick_sort函数对left和right数组进行排序,并通过array_merge函数将排序后的left数组、基准值和排序后的right数组合并成一个完整的排序数组。
-
最终返回结果。
2.2 示例2
示例2中使用了非递归实现的快速排序算法,程序如下:
function quick_sort($arr) {
if (count($arr) <= 1) {
return $arr;
}
$stack = array($arr);
$sorted = array();
while ($stack) {
$unsorted = array_pop($stack);
$pivot = array_shift($unsorted);
$left = $right = array();
foreach ($unsorted as $value) {
if ($value < $pivot){
$left[] = $value;
} else {
$right[] = $value;
}
}
if ($left){
$stack[] = $left;
}
if ($right){
$stack[] = $right;
}
$sorted[] = $pivot;
}
return $sorted;
}
$arr = array(5, 3, 8, 2, 9, 1, 7);
echo "<pre>";
print_r(quick_sort($arr));
echo "</pre>";
上面的示例2中,实现了一个名为quick_sort的函数,其中:
-
判断将要排序的数组长度是否小于等于1,如果是,则直接返回。
-
使用一个名为stack的栈(数组)来保存待排序的数组,使用一个名为sorted的数组来保存已经排好序的元素。
-
循环操作,弹出stack中的一个元素,取其中的第一个元素作为基准值(pivot),将剩余元素依次按照大小放入left或right数组中。
-
如果left或right不为空,则将其压入stack栈中,待后续排序。
-
将基准值压入sorted数组中。
-
重复2-5步骤,直到stack中没有元素。
-
返回已经排序好的数组。
3. 总结
通过以上两个示例,我们可以看到两种不同的PHP实现快速排序算法的方式,其中第一个是递归实现的比较常见,而第二个是非递归实现方式,在处理堆栈数据结构时比较常用。快速排序算法效率高、操作简单、实现方便,是一种比较优秀的排序算法,也是编程技艺中不可或缺的内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP两种快速排序算法实例 - Python技术站