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 常见郁闷问题答解
Nov 25 PHP
PHP 得到根目录的 __FILE__ 常量
Jul 23 PHP
php 删除cookie和浏览器重定向
Mar 16 PHP
一些php技巧与注意事项分析
Feb 03 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
May 07 PHP
linux下使用crontab实现定时PHP计划任务失败的原因分析
Jul 05 PHP
php类中的各种拦截器用法分析
Nov 03 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP异常类及异常处理操作实例详解
Dec 19 PHP
php微信分享到朋友圈、QQ、朋友、微博
Feb 18 PHP
PHP实现微信小程序用户授权的工具类示例
Mar 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
ThinkPHP在新浪SAE平台的部署实例
2014/10/31 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
mac os快速切换多个PHP版本的方法
2017/03/07 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
将JavaScript的jQuery库中表单转化为JSON对象的方法
2015/11/17 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
bootstrap suggest下拉框使用详解
2017/04/10 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
使用vue + less 实现简单换肤功能的示例
2018/02/21 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python计算一个序列的平均值的方法
2015/07/11 Python
TensorFlow实现Logistic回归
2018/09/07 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
python wsgiref源码解析
2021/02/06 Python
软件配置管理有什么好处
2015/04/15 面试题
绩效考核实施方案
2014/03/18 职场文书
教师工作表现评语
2014/12/31 职场文书
元旦晚会开场白
2015/05/29 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
微信小程序APP的生命周期及页面的生命周期
2022/04/19 Javascript