PHP实现快速排序

PHP实现快速排序

简介

程序员在面试时,总会遇到一些算法类题,算法能够体现一个程序员的思维逻辑能力,理解算法每一步的执行逻辑,会更快的提升自己,本人也是小白,有写不足地方欢迎补充。

代码

<?php
class Test
{
    /**
     * Notes: 快速排序
     * User: supengfei
     * Date: 2019/4/21
     * Time: 13:14
     * @param $arr array
     * @return array
     */
    static public function quickSort($arr)
    {
        //判断数组元素个数是否还需继续排序
        $len = count($arr);
        if ($len <= 1) //数组只剩一个元素时,不需要继续排序
        {
            return $arr;
        }
        //定义基准(取数组第一个元素),用于和组内元素比较大小
        $midd = $arr[0];
        //定义小于基准的数组
        $min = [];
        //定义大于基准的数组
        $max = [];
        //根据基准循环判断大小,并赋值给两个数组
        for($i = 1; $i < $len; $i++)
        {
            if($midd > $arr[$i])
            {
                $min[] = $arr[$i]; //小于基准的元素,全部放到左侧
            }else{
                $max[] = $arr[$i]; //大于基准的元素,全部放到右侧
            }
        }
        /** 
            循环第一次结束后$min打印结果为所有小于12的元素,都放在$min中,
        	echo '<pre>';print_r($min);die;
        	<pre><pre>Array
				(
				    [0] => 6
				    [1] => 7
				    [2] => 3
				    [3] => 5
				    [4] => 2
				    [5] => 8
				)
			循环第二遍时,会以6为基准,比较和6的大小,直至数组内只剩下一个元素,比较结束
		    ###--------------------------------------------------####
            循环第一次结束后数组$max打印结果为所有大于12的元素,都放在$max中
        	echo '<pre>';print_r($max);die;
        	<pre><pre>Array
			(
			    [0] => 13
			    [1] => 21
			)
        	**ps:这时用基准判别大于或小于的所有数已经分出来了,但是数组顺序还不是我们想要的正序,下面递归会
        	继续调用,直至数组内元素只剩下一个,程序执行结束。**
        */
        //递归继续排序
        $min = self::quickSort($min);
        $max = self::quickSort($max);
        //合并最终的数组
        return array_merge($min,array($midd),$max);
    }
}
$arr = [12,6,13,7,3,5,2,8,21]; //测试数据
echo '<pre>';print_r(Test::quickSort($arr));

运行结果

<pre><pre>Array
(
    [0] => 2
    [1] => 3
    [2] => 5
    [3] => 6
    [4] => 7
    [5] => 8
    [6] => 12
    [7] => 13
    [8] => 21
)

性能问题

测试时,用到的数组元素较少,数组元素较多进行排序时,不知是否会有性能问题,后期会测试补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值