php循环实现快速排序,PHP实现-快速排序

思路分析

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,

然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

/**

* @param $arr 目标数组

* @param int $l 左起坐标

* @param $r 右起坐标 初始化传入数组时,$r = count($arr)-1

* @return mixed

*/

public  function quick_sort(&$arr, $l=0, $r)

{

$length = count($arr);

//先判断是否需要继续进行 递归出口:数组长度为1,直接返回数组

if(!is_array($arr)||$length <= 1) {return $arr;}

if ($l 

{

$i = $l;

$j = $r;

$baseVal = $arr[$l];

while ($i 

{

// 从右向左找第一个小于$baseVal的数

while($i = $baseVal)

$j--;

if($i 

$arr[$i++] = $arr[$j];

// 从左向右找第一个大于等于$baseVal的数

while($i 

$i++;

if($i 

$arr[$j--] = $arr[$i];

}

$arr[$i] = $baseVal;

$this->quick_sort($arr, $l, $i - 1); // 递归调用

$this->quick_sort($arr, $i + 1, $r);

return $arr;

}

}

/*

* 快速排序法

* */

public function quick_sort2($arr) {

$length = count($arr);

//先判断是否需要继续进行 递归出口:数组长度为1,直接返回数组

if(!is_array($arr)||$length <= 1) {return $arr;}

//选择第一个元素作为基准

$baseValue = $arr[0];

//遍历除了标尺外的所有元素,按照大小关系放入两个数组内

//初始化两个数组

$leftArr = array();  //小于基准的

$rightArr = array();  //大于基准的

//使用for循环进行遍历,把选定的基准当做比较的对象

for($i = 1; $i

if( $arr[$i] 

//放入左边数组

$leftArr[] = $arr[$i];

} else {

//放入右边数组

$rightArr[] = $arr[$i];

}

}

//再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数

$leftArr = $this->quick_sort2($leftArr);

$rightArr = $this->quick_sort2($rightArr);

//合并 左边 标尺 右边, 注意:array($baseValue),关联着重复数据

return array_merge($leftArr, array($baseValue), $rightArr);

}

小结:

时间复杂度:O(n log n)

空间复杂度:O(log n)

既不浪费空间又可以快一点的排序算法

快速排序属于不稳定排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值