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 相关文章推荐
用libtemplate实现静态网页生成
Oct 09 PHP
怎样去阅读一份php源代码
Aug 21 PHP
通过PHP修改Linux或Unix口令的方法分享
Jan 30 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
php实现的双向队列类实例
Sep 24 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
php的ddos攻击解决方法
Jan 08 PHP
微信公众平台之快递查询功能用法实例
Apr 14 PHP
php实现的mongodb操作类
May 28 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
php单元测试phpunit入门实例教程
Nov 17 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
无线电的诞生过程
2021/03/01 无线电
PHP生成静态页
2006/11/25 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
php获取淘宝分类id示例
2014/01/16 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
PHP数组基本用法与知识点总结
2020/06/02 PHP
PHP 裁剪图片
2021/03/09 PHP
ie支持function.bind()方法实现代码
2012/12/27 Javascript
js中定义一个变量并判断其是否为空的方法
2014/05/13 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
JavaScript中this的用法实例分析
2016/12/19 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
vue.js简单配置axios的方法详解
2017/12/13 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
[01:29:46]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第二局
2016/02/27 DOTA
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
Numpy数组的保存与读取方法
2018/04/04 Python
Tensorflow 实现修改张量特定元素的值方法
2018/07/30 Python
详解Python字典小结
2018/10/20 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
python 可视化库PyG2Plot的使用
2021/01/21 Python
营销计划书
2015/01/17 职场文书
汉字听写大会观后感
2015/06/12 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书
导游词之贵州百里杜鹃
2019/10/29 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Qt自定义Plot实现曲线绘制的详细过程
2021/11/02 Python