快速排序 发表于 2019-09-26 分类于 数据与结构 1234567891011121314151617181920212223242526272829303132333435363738394041424344$arr = [11, 8, 43, 23, 10, 100];function quickSort($arr){ $count = count($arr); if ($count <= 1) { return $arr; } //选个轴 $comparedNum = $arr[0]; $smallList = $bigList = array(); for ($i = 1; $i < $count; $i++) { //小于对比数的放一起,大于的放一起 if ($arr[$i] < $comparedNum) { $smallList[] = $arr[$i]; } else { $bigList[] = $arr[$i]; } } $smallList = quickSort($smallList); $bigList = quickSort($bigList); return array_merge($smallList, array($comparedNum), $bigList);}print_r(quickSort($arr)); //Array ( [0] => 8 [1] => 10 [2] => 11 [3] => 23 [4] => 43 [5] => 100 )//重点是理解这里的递归,这里可以举个例子:比如$arr = [2,1,4,3]// 1,第一次执行 $smallList[] = 1;$bigList = [4,3]// 2,调用quickSort($smallList,因为它只有一个元素),函数会直接返回$smallList,因为它只有一个元素// 3,调用quickSort($bigList) 它会执行然后返回一个 array_merge合并后的数组 [3,4]// 3.1 因为这个时候$bigList有2个元素,于是它就会进入到for循环里,然后和对比数对比,// 照样分为$smallList和$bigList 两个数组,这个时候$smallList = [3];$bigList = [],// 然后继续分别调用 $smallList = quickSort($smallList); $bigList = quickSort($bigList); // 但是这个时候他们分别为$smallList为1个元素,$bigList为0个元素,这时候// $count = count($arr);// if ($count <= 1) {// return $arr;// }//这个条件将直接返回,不会再继续递归下去了。然后 array_merge 合并返回// 最后 3 这个步骤里调用的quickSort($bigList) 将会得到一个合并后的结果 [3,4]//最后在把 2 和 3的结果 和 选择的对比数($comparedNum),合并即得到我们最后的结果了。