1. 快速排序
介绍:
快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。
步骤:
- 从数列中挑出一个元素,称为 “基准”(pivot),
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
20140729094606701.png
通过下面这段代码来了解下:所谓快速排序法其实运用的是分治法,将问题分解为规模更小的子问题,将这些规模更小的子问题逐个击破,将已解决的子问题合并,最终得出“母”问题的解;
function sort()
{
$sort = [3, 1, 2, 6, 9, 4, 7, 8, 5];
$sort = $this->quick_sort($sort);
}
function quick_sort($array)
{
if (count($array) <= 1) {
return $array;
}
$key = $array[0];
$rightArray = array();
$leftArray = array();
for ($i = 1; $i < count($array); $i++) {
if ($array[$i] >= $key) {
$rightArray[] = $array[$i];
} else {
$leftArray[] = $array[$i];
}
}
echo "k:" . $key . "<br>";
echo "l:" . json_encode($leftArray) . "<br>";
echo "r:" . json_encode($rightArray) . "<br>";
echo "<hr>";
$leftArray = $this->quick_sort($leftArray);
$rightArray = $this->quick_sort($rightArray);
return array_merge($leftArray, array($key), $rightArray);
}
输出结果:
k:3
l:[1,2]
r:[6,9,4,7,8,5]
-----------------------------------------
k:1
l:[]
r:[2]
-----------------------------------------
k:6
l:[4,5]
r:[9,7,8]
-----------------------------------------
k:4
l:[]
r:[5]
-----------------------------------------
k:9
l:[7,8]
r:[]
-----------------------------------------
k:7
l:[]
r:[8]
网友评论