zoukankan      html  css  js  c++  java
  • 快速排序QuickSort

    <?php
    /**
     * 快速排序
     *
     * @author   ShaoWei Pu <pushaowei0727@gmail.com>
     * @date     2017/6/17
     * @license  MIT
     * -------------------------------------------------------------
     * 思路分析:从数列中挑出一个元素,称为 “基准”(pivot) 
     * 大O表示: O(n log n) 最糟 O(n 2)
     * -------------------------------------------------------------
     * 重新排序数列,所有元素比基准值小的摆放在基准前面,C 语言中的 qsort就是快速排序
     * 所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。
     * 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
     */
    
    // +--------------------------------------------------------------------------
    // | 解题方式
    // +--------------------------------------------------------------------------
    
    /**
     * QuickSort
     *
     * @param array $container
     * @return array
     */
    function QuickSort(array $container)
    {
        $count = count($container);
        if ($count <= 1) { // 基线条件为空或者只包含一个元素,只需要原样返回数组
            return $container;
        }
        $pivot = $container[0]; // 基准值 pivot
        $left  = $right = [];
    
        for ($i = 1; $i < $count; $i++) {
            if ($container[$i] < $pivot) {
                $left[] = $container[$i];
            } else {
                $right[] = $container[$i];
            }
        }
        $left  = QuickSort($left);
        $right = QuickSort($right);
        return array_merge($left, [$container[0]], $right);
    }
    // +--------------------------------------------------------------------------
    // | 方案测试
    // +--------------------------------------------------------------------------
    
    
    print_r(QuickSort([4, 21, 41, 2, 53, 1, 213, 31, 21, 423]));
    /**
     * array(10) {
     * [0] =>
     * int(1)
     * [1] =>
     * int(2)
     * [2] =>
     * int(4)
     * [3] =>
     * int(21)
     * [4] =>
     * int(21)
     * [5] =>
     * int(31)
     * [6] =>
     * int(41)
     * [7] =>
     * int(53)
     * [8] =>
     * int(213)
     * [9] =>
     * int(423)
     * }
     */
    /**
     * PS & EX:
     *  快速排序使用分而治之【 divide and conquer,D&C 】的策略,D&C 解决问题的过程包括两个步骤
     *  1. 找出基线条件,这种条件必须尽可能简单
     *  2. 不断将问题分解(或者说缩小规模),直到符合基线条件
     * (D&C 并非解决问题的算法,而是一种解决问题的思路)
     */
    踩过这个坑,还有下一个坑等着你,这一路就是给自己填坑,坑填多了,也就习惯了,直到这一路平坦了,也就无怨无悔了。
  • 相关阅读:
    POJ 1129 深搜&四色染图&模拟
    POJ 1011 很经典的树枝拼凑的深度搜索
    HDU 2564 词组缩写
    Java中的split函数的用法
    java中next和nextline的区别
    简探this和super
    再探Java中的继承加载顺序
    Java面向接口编程小例子 2
    Dos命令整理集(持续更新)
    VMware WorkStation9.0虚拟机如何运行WINPE
  • 原文地址:https://www.cnblogs.com/xiaofeilin/p/13600623.html
Copyright © 2011-2022 走看看