PHP排序算法类实例


Posted in PHP onJune 17, 2015

本文实例讲述了PHP排序算法类。分享给大家供大家参考。具体如下:

四种排序算法的PHP实现:

1) 插入排序(Insertion Sort)的基本思想是:
每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

2) 选择排序(Selection Sort)的基本思想是:
每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

3) 冒泡排序的基本思想是:
两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

1. sort.php文件如下:

<?php
/**
 * 
 * @author quanshuidingdang
 */
class Sort {
  private $arr  = array(); 
  private $sort  = 'insert';
  private $marker = '_sort';
  private $debug = TRUE;
  /**
   * 构造函数
   *
   * @param  array  例如:
   $config = array (
   'arr' => array(22,3,41,18) , //需要排序的数组值
   'sort' => 'insert', //可能值: insert, select, bubble, quick
   'debug' => TRUE //可能值: TRUE, FALSE
   )
   */
  public function __construct($config = array()) {
    if ( count($config) > 0) {
      $this->_init($config);
    }
  }
  /**
   * 获取排序结果
   */
  public function display() {
    return $this->arr;
  }
  /**
   * 初始化
   *
   * @param  array
   * @return bool
   */
  private function _init($config = array()) {
    //参数判断
    if ( !is_array($config) OR count($config) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_init_param_invaild");
      }
      return FALSE;
    }
    //初始化成员变量
    foreach ($config as $key => $val) {
      if ( isset($this->$key)) {
        $this->$key = $val;
      }
    }
    //调用相应的成员方法完成排序
    $method = $this->sort . $this->marker;
    if ( ! method_exists($this, $method)) {
      if ($this->debug === TRUE) {
        $this->_log("sort_method_invaild");
      }
      return FALSE;
    }
    if ( FALSE === ($this->arr = $this->$method($this->arr)))
      return FALSE;
    return TRUE;
  }
  /**
   * 插入排序
   * 
   * @param  array
   * @return bool
   */
  private function insert_sort($arr) {
    //参数判断
    if ( ! is_array($arr) OR count($arr) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_array(insert)_invaild");
      }
      return FALSE;
    }
    //具体实现
    $count = count($arr);
    for ($i = 1; $i < $count; $i++) {
      $tmp = $arr[$i];
      for($j = $i-1; $j >= 0; $j--) { 
        if($arr[$j] > $tmp) {
          $arr[$j+1] = $arr[$j];
          $arr[$j] = $tmp;
        }
      }
    }
    return $arr;
  }
  /**
   * 选择排序
   * 
   * @param  array
   * @return bool
   */
  private function select_sort($arr) {
    //参数判断
    if ( ! is_array($arr) OR count($arr) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_array(select)_invaild");
      }
      return FALSE;
    }
    //具体实现
    $count = count($arr);
    for ($i = 0; $i < $count-1; $i++) {
      $min = $i;
      for ($j = $i+1; $j < $count; $j++) {
        if ($arr[$min] > $arr[$j]) $min = $j;
      }
      if ($min != $i) {
        $tmp = $arr[$min];
        $arr[$min] = $arr[$i];
        $arr[$i] = $tmp;
      }
    }
    return $arr;
  }
  /**
   * 冒泡排序
   * 
   * @param  array
   * @return bool
   */
  private function bubble_sort($arr) {
    //参数判断
    if ( ! is_array($arr) OR count($arr) == 0) {
      if ($this->debug === TRUE) {
        $this->_log("sort_array(bubble)_invaild");
      }
      return FALSE;
    }
    //具体实现
    $count = count($arr);
    for ($i = 0; $i < $count; $i++) {
      for ($j = $count-1; $j > $i; $j--) {
        if ($arr[$j] < $arr[$j-1]) {
          $tmp = $arr[$j];
          $arr[$j] = $arr[$j-1];
          $arr[$j-1] = $tmp;
        }
      }
    }
    return $arr;  
  }
  /**
   * 快速排序
   * 
   * @param  array
   * @return bool
   */
  private function quick_sort($arr) {
    //具体实现
    if (count($arr) <= 1) return $arr; 
    $key = $arr[0];
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < count($arr); $i++){
      if ($arr[$i] <= $key)
        $left_arr[] = $arr[$i];
      else
        $right_arr[] = $arr[$i];
    }
    $left_arr = $this->quick_sort($left_arr);
    $right_arr = $this->quick_sort($right_arr); 
 
    return array_merge($left_arr, array($key), $right_arr);
  }
  /**
   * 日志记录
   */
  private function _log($msg) {
    $msg = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '\n';
    return @file_put_contents('sort_err.log', $msg, FILE_APPEND);
  }
}
/*End of file sort.php*/
/*Location htdocs/sort.php */

2. sort_demo.php文件如下:

<?php
require_once('sort.php');
$config = array (
  'arr' => array(23, 22, 41, 18, 20, 12, 200303,2200,1192) ,
  //需要排序的数组值
  'sort' => 'select',
  //可能值: insert, select, bubble, quick
  'debug' => TRUE
  //可能值: TRUE, FALSE
);
$sort = new Sort($config);
//var_dump($config['arr']);
var_dump($sort->display());
/*End of php*/

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
php数据库密码的找回的步骤
Jan 12 PHP
PHP无限分类(树形类)的深入分析
Jun 02 PHP
PHP swfupload图片上传的实例代码
Sep 30 PHP
PHP生成自适应大小的缩略图类及使用方法分享
May 06 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 PHP
php 二维数组时间排序实现代码
Nov 19 PHP
Zend Framework入门教程之Zend_View组件用法示例
Dec 09 PHP
php简单处理XML数据的方法示例
May 19 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 PHP
PHP执行linux命令6个函数代码实例
Nov 24 PHP
php准确获取文件MIME类型的方法
Jun 17 #PHP
php操作MongoDB类实例
Jun 17 #PHP
PHP实现的购物车类实例
Jun 17 #PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 #PHP
PHP基于MySQL数据库实现对象持久层的方法
Jun 17 #PHP
php使用curl打开https网站的方法
Jun 17 #PHP
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
Jun 17 #PHP
You might like
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
使用PHPMailer发送邮件实例
2017/02/15 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
js三种排序算法分享
2012/08/16 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
JSON+Jquery省市区三级联动
2016/01/13 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
[02:31]DOTA2帕克 英雄基础教程
2013/11/26 DOTA
Python strip lstrip rstrip使用方法
2008/09/06 Python
python新手经常遇到的17个错误分析
2014/07/30 Python
python对url格式解析的方法
2015/05/13 Python
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
Python使用回溯法子集树模板解决迷宫问题示例
2017/09/01 Python
git进行版本控制心得详谈
2017/12/10 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
Python xlrd模块导入过程及常用操作
2020/06/10 Python
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
电子专业毕业生自荐信
2014/05/25 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
共青团员自我评价范文
2014/09/14 职场文书
县委党的群众路线教育实践活动工作情况报告
2014/10/25 职场文书
高一数学教学反思
2016/02/18 职场文书
《黄山奇石》教学反思
2016/02/18 职场文书
适合后台管理系统开发的12个前端框架(小结)
2021/06/29 Javascript