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 什么是PEAR?
Mar 19 PHP
vs中通过剪切板循环来循环粘贴不同内容
Apr 30 PHP
php中使用Akismet防止垃圾评论的代码
Jun 10 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
php实现分页工具类分享
Jan 09 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
PHP类的封装与继承详解
Sep 29 PHP
无需数据库在线投票调查php代码
Jul 20 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
PHP删除字符串中非字母数字字符方法总结
Jan 20 PHP
php操作redis命令及代码实例大全
Nov 19 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判断linux下程序问题实例
2015/07/09 PHP
分享php多功能图片处理类
2016/05/15 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
php use和include区别总结
2019/10/13 PHP
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
JQuery datepicker 使用方法
2011/05/20 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
利用原生js和jQuery实现单选框的勾选和取消操作的方法
2016/09/04 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
Vue实现路由跳转和嵌套
2017/06/20 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
使用JS实现图片轮播的实例(前后首尾相接)
2017/09/21 Javascript
详解webpack提取第三方库的正确姿势
2017/12/22 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
js实现一个简易计算器
2020/03/30 Javascript
python读取浮点数和读取文本文件示例
2014/05/06 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
Python之NumPy(axis=0 与axis=1)区分详解
2019/05/27 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
python获得命令行输入的参数的两种方式
2020/11/02 Python
css3教程之倾斜页面
2014/01/27 HTML / CSS
Hurley官方网站:扎根于海滩生活方式的全球青年文化品牌
2020/05/18 全球购物
文员个人的求职信范文
2013/09/26 职场文书
自荐书模板
2013/12/15 职场文书
土木工程专业推荐信
2014/02/19 职场文书
教师自我鉴定范文
2014/03/20 职场文书
市场营销专业毕业生求职信
2014/03/26 职场文书
2014年教师学期工作总结
2014/11/08 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python
html输入两个数实现加减乘除功能
2021/07/01 HTML / CSS
Python list列表删除元素的4种方法
2021/11/01 Python
MySQL实现配置主从复制项目实践
2022/03/31 MySQL