php 单例模式排序算法类

闲极无聊 随便练习一下排序算法 有用到的同学可以看下

<?php
/**
 * 排序类
 */
class Sort
{
    //实例对象
    private static $instance = null;

    //排序方法
    private static $func = null;

    //排序类别
    private static $order = null;

    //防止克隆
    public function __clone()
    {
        trigger_error("不能克隆", E_USER_ERROR);
    }

    //防止实例化
    private function __construct(){}

    /**
     * 获取类实例
     * @param string $func 排序方法
     * @param string $order 排序类别
     * @return null|Sort
     */
    public static function getInstance()
    {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    //进行排序
    public function actionSort($data = array(), $order = "asc", $func = "Bubble")
    {
        //检查数据是否为数组和是否为空
        if (!is_array($data) or empty($data)) return $data;

        //检查排序类别
        self::$order = strtolower($order);
        if (!in_array(self::$order, array("asc", "desc"))) self::$order = "asc";

        //检查方法名称
        self::$func = ucwords(strtolower($func));
        if (!method_exists(self::$instance, self::$func)) self::$func = "Bubble";

        //调用相应排序方法
        return call_user_func(array(self::$instance, self::$func), $data);
    }

    /**
     * 冒泡排序法
     * @param  array $data 排序数组
     * @return array
     */
    public function Bubble($data = array())
    {
        $number = count($data);
        for ($i = 1; $i < $number; $i++) {
            for ($k = 0; $k < $number - $i; $k++) {
                if (self::$order == "asc" ? $data[$k] > $data[$k + 1] : $data[$k] < $data[$k + 1]) {
                    $tmp = $data[$k + 1];
                    $data[$k + 1] = $data[$k];
                    $data[$k] = $tmp;
                }
            }
        }
        return $data;
    }

    /**
     * 选择排序法
     * @param  array $data 排序数组
     * @return array
     */
    public function Select($data = array())
    {
        $number = count($data);
        for ($i = 0; $i < $number - 1; $i++) {
            $threshold = $i;
            for ($k = $i + 1; $k < $number; $k++) {
                if (self::$order == "asc" ? $data[$threshold] > $data[$k] : $data[$threshold] < $data[$k]) {
                    $threshold = $k;
                }
            }

            if ($threshold != $i) {
                $tmp = $data[$i];
                $data[$i] = $data[$threshold];
                $data[$threshold] = $tmp;
            }
        }
        return $data;
    }

    /**
     * 插入排序法
     * @param array $data 排序数组
     * @return array
     */
    public function Insert($data = array())
    {
        $number = count($data);
        for ($i = 1; $i < $number; $i++) {
            $threshold = $data[$i];
            for ($k = $i - 1; $k >= 0; $k--) {
                if (self::$order == "asc" ? $threshold < $data[$k] : $threshold > $data[$k]) {
                    $data[$k + 1] = $data[$k];
                    $data[$k] = $threshold;
                } else {
                    break;
                }
            }
        }
        return $data;
    }

    /**
     * 快速排序法
     * @param  array $data 排序数组
     * @return array
     */
    public function Quick($data = array())
    {
        $number = count($data);
        if ($number <= 1) {
            return $data;
        }

        $left_data = $right_data = array();
        $threshold = $data[0];
        for ($i = 1; $i < $number; $i++) {
            if (self::$order == "asc" ? $threshold > $data[$i] : $threshold < $data[$i]) {
                $left_data[] = $data[$i];
            } else {
                $right_data[] = $data[$i];
            }
        }

        $left_data = $this->Quick($left_data);
        $right_data = $this->Quick($right_data);

        return array_merge($left_data, array($threshold), $right_data);
    }
}

echo implode(",", Sort::getInstance()->actionSort(array(12, 3, 5, 6, 78, 9), "desc", "Insert"));

 

转载于:https://my.oschina.net/u/2529258/blog/822547

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值