您的位置:首页 > 编程语言 > PHP开发

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 排序 算法