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 相关文章推荐
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 PHP
写出高质量的PHP程序
Feb 04 PHP
解析php做推送服务端实现ios消息推送
Jul 01 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
php以post形式发送xml的方法
Nov 04 PHP
实例讲解php数据访问
May 09 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
php微信公众平台开发之微信群发信息
Sep 13 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
php实现解析xml并生成sql语句的方法
Feb 03 PHP
PHP大文件及断点续传下载实现代码
Aug 18 PHP
php去除deprecated的实例方法
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
使用Apache的rewrite技术
2006/06/22 PHP
简单示例AJAX结合PHP代码实现登录效果代码
2008/07/25 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
javascript Base类 包含基本的方法
2009/07/22 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
JS的Document属性和方法小结
2013/09/17 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
如何清除IE10+ input X 文本框的叉叉和密码输入框的眼睛图标
2016/12/21 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
js实现随机点名程序
2020/09/17 Javascript
JavaScript简易计算器制作
2020/01/17 Javascript
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
Python编写电话薄实现增删改查功能
2016/05/07 Python
从CentOS安装完成到生成词云python的实例
2017/12/01 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
Fenty Beauty官网:蕾哈娜创立的美妆品牌
2021/01/07 全球购物
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
建筑自我鉴定
2013/10/19 职场文书
护士专业推荐信
2013/11/02 职场文书
美术专业个人自我评价
2014/01/18 职场文书
体育教师个人的自我评价
2014/02/16 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
小学班级特色活动方案
2014/08/31 职场文书
委托书范本
2014/09/13 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
在python中实现导入一个需要传参的模块
2021/05/12 Python