原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
举个例子
如无序数组[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