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.ini中添加extension=php_mysqli.dll指令的说明
Jun 14 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
PHP获取本周第一天和最后一天示例代码
Feb 24 PHP
PHP把数字转成人民币大写的函数分享
Jun 30 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
PHP编写文件多服务器同步程序
Jul 02 PHP
PHP会话操作之cookie用法分析
Sep 28 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
php文件包含的几种方式总结
Sep 19 PHP
PHP7 错误处理机制修改
Mar 09 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调用mysql数据 dbclass类
2011/05/07 PHP
php cli配置文件问题分析
2015/10/15 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
基于PHP常用文件函数和目录函数整理
2017/08/17 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
编写高质量JavaScript代码的基本要点
2016/03/02 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
JS实现table表格固定表头且表头随横向滚动而滚动
2017/10/26 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
2018/07/31 jQuery
vue项目中常见问题及解决方案(推荐)
2019/10/21 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
vue element 中的table动态渲染实现(动态表头)
2019/11/21 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
python多维数组分位数的求取方式
2020/03/03 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
测试驱动开发的主要步骤是什么
2014/12/10 面试题
大学毕业的自我鉴定
2013/10/08 职场文书
求职推荐信
2013/10/28 职场文书
大学毕业感言一句话
2014/02/06 职场文书
人力资源经理的岗位职责
2014/03/02 职场文书
农村面貌改造提升实施方案
2014/03/18 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
幼师个人总结范文
2015/02/28 职场文书
2015社区爱国卫生工作总结
2015/04/21 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP
深入理解go slice结构
2021/09/15 Golang
Python实现猜拳与猜数字游戏的方法详解
2022/04/06 Python