快速排序
这也是在实际中最常用的一种排序算法,速度快,效率高。就像名字一样,快速排序是最优秀的一种排序算法。
时间复杂度 O(nlogn) 最坏时间复杂度O(n^2)
快速排序采用的思想是分治思想。
- 找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。
- 递归快速排序,将其他n-1个元素也调整到排序后的正确位置。
- 直到所有的左右区间只有一个数。此时每个元素都是在排序后的正 确位置,排序完成。
所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
function quickSort($arr)
{
//快速排序算法说明:取第一个数为基数,其他数与基数比较,
//比基数小的放在基数左边形成左区间,比基数大的或一样的放在基数右边形成有区间
//在对这两个区间重复上面的方法,之道每个区间内只有一个数,就实现了将原集合从小到大排序
if (count($arr) <=1) {
return $arr;
}
$tmp = $arr[0];
unset($arr[0]); //取出基数
$left = array(); //左区间
$right = array(); //右区间
foreach($arr as $value) {
if ($value >= $tmp) {
$right[] = $value;
} else {
$left[] = $value;
}
}
if (count($left)) $left = quickSort($left); //递归排序左区间内的数
if (count($right)) $right = quickSort($right); //递归排序右区间内的数
return array_merge($left, [$tmp], $right); //递归合并
}