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 相关文章推荐
GD输出汉字的函数的分析
Oct 09 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
数据库中排序的对比及使用条件详解
Feb 23 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
PHP中的日期加减方法示例
Aug 21 PHP
PHP生成不重复随机数的方法汇总
Nov 19 PHP
php中 $$str 中 &quot;$$&quot; 的详解
Jul 06 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
PHP 实现 WebSocket 协议原理与应用详解
Apr 22 PHP
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
Apr 11 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 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php Smarty初体验二 获取配置信息
2011/08/08 PHP
教你如何使用php session
2013/10/28 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
php实现文件预览功能
2017/05/23 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
Mootools 1.2教程 设置和获取样式表属性
2009/09/15 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
Vue+Vant 图片上传加显示的案例
2020/11/03 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
深入理解python中函数传递参数是值传递还是引用传递
2017/11/07 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
用于业余项目的8个优秀Python库
2018/09/21 Python
django+tornado实现实时查看远程日志的方法
2019/08/12 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
2014两会学习心得:时代的发展
2014/03/17 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
客运企业隐患排查工作方案
2014/06/06 职场文书
采购部长岗位职责
2014/06/13 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
2014审计局领导班子民主生活会对照检查材料思想汇报
2014/09/20 职场文书
青岛海底世界导游词
2015/02/11 职场文书
房贷收入证明范本
2015/06/12 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
python ansible自动化运维工具执行流程
2021/06/24 Python