算法原理
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
PHP实现快速排序
递归实现
<?php
function quickSort($arr){
if(count($arr)>1){
$k=$arr[0];
$x=array();
$y=array();
$count=count($arr);
for($i=1;$i<$count;$i++){
if($arr[$i]<=$k){
$x[]=$arr[$i];
}else{
$y[]=$arr[$i];
}
}
$x=quickSort($x);
$y=quickSort($y);
return array_merge($x,array($k),$y);
}else{
return $arr;
}
}
$arr = [15, 33, 6, 43, 666, 4, 28, 39, 99, 2];
$res = quickSort($arr);
print_r($res);
非递归实现
function quickSortByStack($arr)
{
$index_arr[0] = ['left' => 0, 'right' => count($arr) - 1]; //该数组保存需要排序的子数组边界
$i = 0; // 记录当前排序了几次子数组
$n = 1; // 当前还有几个子数组需要排序
while ($i < $n) { // 判断还有未排序子数组存在
$left = $index_arr[$i]['left']; // 数组左边界下标
$right = $index_arr[$i]['right']; // 数组右边界下标
$middleKey = $left; // 要对比值的下标,一轮对比交换下来,左边的值都比它小,右边的值都比它大
$flag = false; // 通过此标记决定是从左往右比还是从右往左比
while ($left <= $right) {
// 从右往左对比,直到右边的值比对比值小,则交换位置
if ($flag == false) {
if ($arr[$right] < $arr[$middleKey]) {
$temp = $arr[$middleKey];
$arr[$middleKey] = $arr[$right];
$arr[$right] = $temp;
$middleKey = $right; // 对比值最新的下标
$flag = true;
}
$right--; // 对比完一次则右边下标减一
}
// 从左往右对比,直到左边的值比对比值大,则交换位置
if ($flag) {
if ($arr[$left] > $arr[$middleKey]) {
$t = $arr[$middleKey];
$arr[$middleKey] = $arr[$left];
$arr[$left] = $t;
$middleKey = $left; // 对比值最新的下标
$flag = false;
}
$left++; // 对比完一次则左边下标加一
}
}
//保存子数组的边界值
if ($index_arr[$i]['left'] < $middleKey - 1) {
$index_arr[$n] = ['left' => $index_arr[$i]['left'], 'right' => $middleKey - 1];
$n++;
}
if ($index_arr[$i]['right'] > $middleKey + 1) {
$index_arr[$n] = ['left' => $middleKey + 1, 'right' => $index_arr[$i]['right']];
$n++;
}
$i++;
}
return $arr;
}