快速排序: 效率比较高, 使用空间换时间(递归)
原理: 从一个数组中,随机取出一个元素: 以该元素为基准,将数组中剩余的其他元素挨个的与当前元素进行比较: 比元素小的存放到一个数组, 比元素大的也存放到一个数组. 当所有的元素都比较完之后: 一定会确定中间元素(取出的元素)的位置.
两边的数组依然需要排序: 利用上述解决问题的方式解决子问题(递归点),直到数组元素个数为1, 再返回(递归出口), 返回的结果与上述的结果进行合并.
代码实现
/** * 快速排序 * @param array $arr 待排序的数组 * @return array 已经排序好的数组 */ function quick_sort($arr) { // 求出数组长度 $len = count($arr); // 递归出口判断 if ($len <= 1) return $arr; // 取出第一个元素 $middle = $arr[0]; // 剩余元素与第一个元素进行比较 $left = $right = array(); for ($i = 1;$i < $len;$i++) { // 比较:小的放左边,大的放右边 if($arr[$i] < $middle){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } // $left和$right都是未排序的数组 $left = empty($left) ? $left : quick_sort($left); // 等待:left排好序 $right = empty($right) ? $right : quick_sort($right); // 合并数组: 返回 return array_merge($left,array($middle),$right); } // 定义要排序的数组 $arr = array(3,1,6,9,2,1); // 调用函数 print_r(quick_sort($arr)); // Array ( [0] => 1 [1] => 1 [2] => 2 [3] => 3 [4] => 6 [5] => 9 )