思路分析
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,
然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
/**
* @param $arr 目标数组
* @param int $l 左起坐标
* @param $r 右起坐标 初始化传入数组时,$r = count($arr)-1
* @return mixed
*/
public function quick_sort(&$arr, $l=0, $r)
{
$length = count($arr);
//先判断是否需要继续进行 递归出口:数组长度为1,直接返回数组
if(!is_array($arr)||$length <= 1) {return $arr;}
if ($l
{
$i = $l;
$j = $r;
$baseVal = $arr[$l];
while ($i
{
// 从右向左找第一个小于$baseVal的数
while($i = $baseVal)
$j--;
if($i
$arr[$i++] = $arr[$j];
// 从左向右找第一个大于等于$baseVal的数
while($i
$i++;
if($i
$arr[$j--] = $arr[$i];
}
$arr[$i] = $baseVal;
$this->quick_sort($arr, $l, $i - 1); // 递归调用
$this->quick_sort($arr, $i + 1, $r);
return $arr;
}
}
/*
* 快速排序法
* */
public function quick_sort2($arr) {
$length = count($arr);
//先判断是否需要继续进行 递归出口:数组长度为1,直接返回数组
if(!is_array($arr)||$length <= 1) {return $arr;}
//选择第一个元素作为基准
$baseValue = $arr[0];
//遍历除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$leftArr = array(); //小于基准的
$rightArr = array(); //大于基准的
//使用for循环进行遍历,把选定的基准当做比较的对象
for($i = 1; $i
if( $arr[$i]
//放入左边数组
$leftArr[] = $arr[$i];
} else {
//放入右边数组
$rightArr[] = $arr[$i];
}
}
//再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
$leftArr = $this->quick_sort2($leftArr);
$rightArr = $this->quick_sort2($rightArr);
//合并 左边 标尺 右边, 注意:array($baseValue),关联着重复数据
return array_merge($leftArr, array($baseValue), $rightArr);
}
小结:
时间复杂度:O(n log n)
空间复杂度:O(log n)
既不浪费空间又可以快一点的排序算法
快速排序属于不稳定排序