php 单例模式排序算法类
2017-01-11 00:00
288 查看
闲极无聊 随便练习一下排序算法 有用到的同学可以看下
<?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"));
相关文章推荐
- PHP & Java(2)
- PHP 获取客户端 IP 地址的方法实例代码
- PHP对象编程实现3D饼图
- 用PHP动态生成虚拟现实VRML网页
- 用php生成excel文件
- JavaScript+PHP 应用一:网页制作中双下拉菜单的动态实现
- JavaScript + PHP 应用二:网页设计中树形菜单的动态实现
- 用linux下的php3发E-MAIL
- 在C、JAVA、PHP中操作postgreSql数据库
- PHP实现文件上传的一种好方法
- 如何对PHP程序中的常见漏洞进行攻击(上)
- 如何对PHP程序中的常见漏洞进行攻击(下)
- 用PHP编写email群发器
- Apache、SSL、MySQL和PHP平滑无缝地安装
- PHP & Java(4)
- PHP & Java(3)
- UNIX下的PHP环境配置,+apache
- PHP & Java(1)
- php录入页面中动态从数据库中提取数据的实现
- 用PHP增强UNIX/LINUX网站功能