排序算法之快速排序
快排简介: 快速排序是一种基于分治技术的重要排序算法,是冒泡算法的一种改进。是由东尼.霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要O(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。
快排原理:快速排序用分治的思想,将一个整串分为两个子串。左边子串中所有的数都不会大于右边子串中的数。
步骤为:(1)从数组中挑选一个数作为“中轴”,(选择中轴有许多不同的策略,不过我们一般会选择数组的第一个元素)。
(2)重新排列数组,使得所有比中轴小的元素放在中轴的左边,所有比中轴大的元素放在中轴的右边,中轴元素放在中间。当然,跟中轴相等的数放在哪边都无所谓。
(3)按上述步骤递归执行新生成的子串。
递归的最底层是零个或者一个数,也就说是已经排好序的。
代码实现:
1.数据实现:
<?php
function quickSort($arr) {
$len = count($arr);
if ($len <= 1) {
return $arr;
}
$key = $arr[0];
$left_arr = array();
$right_arr = array();
for ($i = 1; $i < $len; $i++) {
if ($arr[$i] <= $key) {
$left_arr[] = $arr[$i];
} else {
$right_arr[] = $arr[$i];
}
}
$left_arr = quickSort($left_arr);
$right_arr = quickSort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
$arr = array(49, 38, 2, 65, 97, 76, 13, 27);
print_r(quickSort($arr));
?>
2.循环实现:
<?php
/* 快速排序
* @param $arr 待排序数组
* @param $start 排序的开始坐标
* @param $end 排序数组的结束坐标
*/
function quickSort(Array &$arr, $start, $end) {
$low = $start;
$high = $end;
#同时移动low和high,low找比$arr[$start]大的元素,high找比$arr[$start]小的元素
#交换大小元素位置,知道low=high
while ($low != $high) {
while ($arr[$low] <= $arr[$start] && $low != $high) {
++$low;
}
while ($arr[$high] >= $arr[$start] && $low != $high) {
--$high;
}
$temp = $arr[$low];
$arr[$low] = $arr[$high];
$arr[$high] = $temp;
}
#如果low和high指向的元素小于$arr[$start],交换$arr[$start]和这个元素
#否则交换$arr[$start]和low指向的前一个元素,然后进入递归
if ($low != $start && $arr[$low] > $arr[$start]) {
$low--;
}
$temp = $arr[$low];
$arr[$low] = $arr[$start];
$arr[$start] = $temp;
#递归中止条件是切分后的部分只剩下一个元素
if ($low - 1 > $start)
quickSort($arr, $start, $low - 1);
if ($low + 1 < $end)
quickSort($arr, $low + 1, $end);
}
$arr = array(8, 3, 2, 9, 7, 1, 5);
quickSort($arr, 0, count($arr) - 1);
print_r($arr);
?>
算法分析:
快排平均效率O(nlogn),最好情况O(nlogn),最坏情况是当数组有序时,退化成O(n^2)

浙公网安备 33010602011771号