原理:
在一个数组中,选一个元素(通常是第一个元素或者数组的中间元素)与剩余的其它元素进行比较:建立两个分组(左组和右组),比当前元素小的放在左组,比当前元素大的放在右组。这样一来,将左组,中间组合右组合并起来就形成一个已经“排好序”的数组。实际上,左组和右组中的元素并不一定已经排好序,调用自己去排序,只有左右数组的元素个数大于1,就需要排序,如果元素个数等于一个,就不再调用函数。
使用递归实现(步骤):
1、实现从数组中取出一个元素:将小的放左边数组,大的放右边数组,最后返回合并结果
2、 左右两边数组有可能没有排好序:需要调用函数进行排序:函数本身就是为了给数组进行排序:调用自己解决自己的问题:递归
3、 递归开始:就必须找出递归出口:递归出口是数组的元素要小于等于1
<?php //算法:快速排序 function quick_sort($arr) { //在数组中取出第一个元素作为中间值 $middle = $arr[0]; //定义两个空数组 $left = $right = array(); //循环遍历,从第二个元素开始 for($i=1,$len = count($arr);$i < $len;$i++) { //判断:比较中间值和数组中每一个元素 if($middle > $arr[$i]) { //比中间值 $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } //比较完之后,左数组和右数组不一定只有一个值,所以要对左右数组的长度进行判断,若长度大于1则需再次比较 //判断左右数组的长度 if(count($left)>1) { $left = quick_sort($left); } if(count($right)>1) { $right = quick_sort($right); } //合并数组左数组、中间值和右数组 return array_merge($left,array($middle),$right); } //定义数组 $arr = array(6,72,65,76,5,2,83,9,23,0,68); print_r(quick_sort($arr));
执行结果:
Array ( [0] => 0 [1] => 2 [2] => 5 [3] => 6 [4] => 9 [5] => 23 [6] => 65 [7] => 68 [8] => 72 [9] => 76 [10] => 83 )
时间: 2024-10-12 09:48:42