经典排序算法集锦(PHP实现)

一、 经典排序算法——冒泡排序

   1.冒泡排序的中心思想:

     从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。

     算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾,从而形成有序的队列。

 

      2.代码实现:

    /**
     * 冒泡排序
     */
    public function bubble()
    {
        # 由小到大排序

        # 定义待排序数据
        $data = [8, 5, 5, 8, 1, 3, 6, 95, 25, 252, 5552, 44526, 5522, 522, 336];

        # 定义交换元素位置的变量,临时存储元素值使用
        $temp = null;

        # 实现
        # 1.外层循环控制头部元素,并且从第一个元素开始,最后一个元素结束
        for ($i = 0; $i < count($data); $i++) {
            # 2.内层循环控制外层循环之后的每一个元素,到最后一个结束 (比如外层是第一个8,那么内层就是5、5、8、1、3·····)
            for ($j = $i + 1; $j < count($data); $j++) {
                # 倘若$i控制的元素值大于$j控制的元素值,那么我们将两者交换位置
                if ($data[$i] > $data[$j]) {
                    $temp     = $data[$j];
                    $data[$j] = $data[$i];
                    $data[$i] = $temp;
                }
            }
        }

        return response($data);
    }

 

 

     3.输出结果:

           

 

 

 

二、 经典排序算法——快速排序

   1.快速排序的中心思想:

     快速排序是由分治思想产生的,通过每次排序将待排序内容分成两部分,一部分保存的元素值比另一部分保存的元素值小;

      之后分别对这两部分继续进行排序(使用同样的算法,实际就是递归),使整个列表有序

   2.代码实现:

    /**
     * 快速排序
     */
    public function quick()
    {
        # 由小到大排序

        # 定义待排序数据
        $data = [8, 5, 5, 8, 1, 3, 6, 95, 25, 252, 5552, 44526, 5522, 522, 336];

        $result = $this->quick_do($data);

        return response($result);
    }

    /**
     * 快速排序执行
     */
    public function quick_do($data)
    {
        # 检查参数长度,如果只有一个元素,则直接返回,无须比较,否则会出现死循环
        if (count($data) <= 1) {
            return $data;
        }

        # 定义基准元素(以此元素为基准进行分治处理,model_element:标兵元素)
        $model_element = $data[0];

        # 定义容器数组
        $left_array = $right_array = [];

        # 将元素全部与标兵元素进行对比,小于标兵元素的放在left_array中;大于标兵元素的放在right_array中
        for ($i = 1; $i < count($data); $i++) {
            if ($data[$i] > $model_element) {
                $right_array[] = $data[$i];
            } else if ($data[$i] <= $model_element) {
                $left_array[] = $data[$i];
            }
        }

        # 递归处理分治好的元素,实际上是使用本逻辑继续处理分治好的元素,递归后一定会得到有序的内容
        $left_array  = $this->quick_do($left_array);
        $right_array = $this->quick_do($right_array);

        # 合并最后结果,把标兵元素放在中间位置
        return array_merge($left_array, [$model_element], $right_array);
    }

     3.输出结果:

 

posted @ 2020-11-07 15:16  ShareJia  阅读(134)  评论(0)    收藏  举报