原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
举个例子
如无序数组[6 2 4 1 5 9]
a),先把第一项[6]取出来,
用[6]依次与其余项进行比较,
如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边
如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,
一趟排完后变成下边这样:
排序前 6 2 4 1 5 9
排序后 2 4 1 5 6 9
b),对前半拉[2 4 1 5]继续进行快速排序
重复步骤a)后变成下边这样:
排序前 2 4 1 5
排序后 1 2 4 5
前半拉排序完成,总的排序也完成:
排序前:[6 2 4 1 5 9]
排序后:[1 2 4 5 6 9]
排序结束
PHP代码实现参考:
举个例子
如无序数组[6 2 4 1 5 9]
a),先把第一项[6]取出来,
用[6]依次与其余项进行比较,
如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边
如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,
一趟排完后变成下边这样:
排序前 6 2 4 1 5 9
排序后 2 4 1 5 6 9
b),对前半拉[2 4 1 5]继续进行快速排序
重复步骤a)后变成下边这样:
排序前 2 4 1 5
排序后 1 2 4 5
前半拉排序完成,总的排序也完成:
排序前:[6 2 4 1 5 9]
排序后:[1 2 4 5 6 9]
排序结束
PHP代码实现参考:
/**
* 快速排序(常规实现)
* 工作原理:通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。
* 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
*
* 实现方法:通过基准数
* 在一段数组中,以第一个元素为基准数。分别从2边挑选小于和大于这个基准数的位置进行交换。
* 两边的位置都向中间靠拢直至相遇,则拿相遇的这个位置的值与基准数交换。
* 再将此基准数2边的2段数组分别执行上述交换操作,直至无数可交换。
* @param unknown $arr
* @return unknown
*/
function quick_sort($arr){
function do_quick_sort(&$arr,$min,$max){
if($min>$max)return false;
$centre_value = $arr[$min]; // 以该段数组的第一个元素为基准数
$i = $min; // 左边起点位置(重要,自己也要放到对比中)
$j = $max; // 右边起点位置
while ($i!=$j) {
// 右侧依次向左,也找一个大于基准数的数(重要,需要从右边开始)
while ($arr[$j]>=$centre_value && $i<$j) $j--;
// 左边依次向右,找一个大于基准数的数
while ($arr[$i]<=$centre_value && $i<$j) $i++;
// 交换位置
swap($arr[$i], $arr[$j]);
}
//最终将基准数归位
$arr[$min] = $arr[$i];
$arr[$i] = $centre_value;
// 对基准的2侧翼再进行快速排序
do_quick_sort($arr,$min,$i-1);
do_quick_sort($arr,$i+1,$max);
}
do_quick_sort($arr,0,count($arr)-1);
return $arr;
}
/**
* 快速排序(个人改版,经测试内存消耗更低)
* 工作原理:通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。
* 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
*
* 实现方法:通过生成左右2边的子数组再合并的方式
* @param unknown $arr
* @return unknown
*/
function quick_sort2($arr){
if( count($arr)<=1 ){
return $arr;
}
$left_arr = $right_arr = [];
// 先以第一个数为中间值,将数组划分到左右两部分
$centre_value = $arr[0];
$count = count($arr);
for($i=1;$i<$count;$i++){
if( $arr[$i]<=$centre_value ){
$left_arr[] = $arr[$i];
}else{
$right_arr[] = $arr[$i];
}
}
// 再对这2部分分别进行快速排序成有序数组
$left_arr = quick_sort2($left_arr);
$right_arr = quick_sort2($right_arr);
// 再合并数组返回
return array_merge($left_arr,[$centre_value],$right_arr);
}
http://www.cnblogs.com/kkun/archive/2011/11/23/2260270.html
http://developer.51cto.com/art/201403/430986.htm