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 相关文章推荐
php 获取mysql数据库信息代码
Mar 12 PHP
PHP 日常开发小技巧
Sep 23 PHP
php中防止恶意刷新页面的代码小结
Oct 31 PHP
Smarty中调用FCKeditor的方法
Oct 27 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
Dec 24 PHP
php上传中文文件名乱码问题处理方案
Feb 03 PHP
php隐藏实际地址的文件下载方法
Apr 18 PHP
php函数连续调用实例分析
Jul 30 PHP
PHP实现伪静态方法汇总
Jan 13 PHP
php动态读取数据清除最右边距的方法
Apr 12 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
PHP实现考试倒计时功能代码
Apr 16 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php中的比较运算符详解
2013/10/28 PHP
php实现的用户查询类实例
2015/06/18 PHP
php+ajax注册实时验证功能
2016/07/20 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
onpropertypchange
2006/07/01 Javascript
为Extjs加加速(javascript加速)
2010/08/19 Javascript
multiSteps 基于Jquery的多步骤滑动切换插件
2011/07/22 Javascript
JS中如何判断传过来的JSON数据中是否存在某字段
2014/08/18 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
JavaScript每天必学之事件
2016/09/18 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
详解vue.js的事件处理器v-on:click
2017/06/27 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
JavaScript中正则表达式使数字、中文或指定字符高亮显示
2017/10/31 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
2018/09/26 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
微信小程序 子级页面返回父级并把子级参数带回父级实现方法
2019/08/22 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
Python实现Restful API的例子
2019/08/31 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
The North Face官方旗舰店:美国著名户外品牌
2020/09/28 全球购物
开朗女孩的自我评价
2014/02/10 职场文书
空气环保标语
2014/06/12 职场文书
企业读书活动总结
2014/06/30 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
专业见习报告范文
2014/11/03 职场文书
群众路线学习心得体会范文
2014/11/05 职场文书