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 相关文章推荐
mysql时区问题
Mar 26 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
destoon之一键登录设置
Jun 21 PHP
简单实用的网站PHP缓存类实例
Jul 18 PHP
php实现斐波那契数列的简单写法
Jul 19 PHP
php实现将任意进制数转换成10进制的方法
Apr 17 PHP
php防止网站被攻击的应急代码
Oct 21 PHP
LAMP环境使用Composer安装Laravel的方法
Mar 25 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
详细解读php的命名空间(一)
Feb 21 PHP
PHP各种常见经典算法总结【排序、查找、翻转等】
Aug 05 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
实用函数2
2007/11/08 PHP
php自动识别文件编码并转换为UTF-8的方法
2014/06/12 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
用jquery实现自定义风格的滑动条实现代码
2011/04/26 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
JavaScript prototype属性深入介绍
2012/11/27 Javascript
jquery+php实现搜索框自动提示
2014/11/28 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
浅谈JavaScript异常处理语句
2015/06/26 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
vue.js表格分页示例
2016/10/18 Javascript
微信小程序  网络请求API详解
2016/10/25 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
基于node.js制作简单爬虫教程
2017/06/29 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
layui实现把数据表格时间戳转换为时间格式的例子
2019/09/12 Javascript
微信小程序如何获取用户头像和昵称
2019/09/23 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
总结Python编程中函数的使用要点
2016/03/20 Python
在Python中通过threading模块定义和调用线程的方法
2016/07/12 Python
详解python中index()、find()方法
2019/08/29 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
六一儿童节活动策划方案
2014/01/27 职场文书
光盘行动倡议书
2014/02/02 职场文书
2015年服务员个人工作总结
2015/05/27 职场文书
贴吧吧主申请感言
2015/08/03 职场文书