当前位置:首页 > PHP教程 > php类库 > 列表

PHP排序算法类实例

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-28 20:41:16 浏览: 评论:0 

这篇文章主要介绍了PHP排序算法类,实例分析了插入排序、选择排序、冒泡排序、快速排序等排序算法的原理与实现技巧,需要的朋友可以参考下。

本文实例讲述了PHP排序算法类,分享给大家供大家参考,具体如下:

四种排序算法的PHP实现:

1) 插入排序(Insertion Sort)的基本思想是:

每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。

2) 选择排序(Selection Sort)的基本思想是:

每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。

3) 冒泡排序的基本思想是:

两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。

4) 快速排序实质上和冒泡排序一样,都是属于交换排序的一种应用。所以基本思想和上面的冒泡排序是一样的。

1. sort.php文件如下:

  1. <?php 
  2. /** 
  3.  *  
  4.  * @author quanshuidingdang 
  5.  */ 
  6. class Sort { 
  7.   private $arr  = array();  
  8.   private $sort  = 'insert'
  9.   private $marker = '_sort'
  10.   private $debug = TRUE; 
  11.   /** 
  12.    * 构造函数 
  13.    * 
  14.    * @param  array  例如: 
  15.    $config = array ( 
  16.    'arr' => array(22,3,41,18) , //需要排序的数组值 
  17.    'sort' => 'insert', //可能值: insert, select, bubble, quick 
  18.    'debug' => TRUE //可能值: TRUE, FALSE 
  19.    ) 
  20.    */ 
  21.   public function __construct($config = array()) { 
  22.     if ( count($config) > 0) { 
  23.       $this->_init($config); 
  24.     } 
  25.   } 
  26.   /** 
  27.    * 获取排序结果 
  28.    */ 
  29.   public function display() { 
  30.     return $this->arr; 
  31.   } 
  32.   /** 
  33.    * 初始化 
  34.    * 
  35.    * @param  array 
  36.    * @return bool 
  37.    */ 
  38.   private function _init($config = array()) { 
  39.     //参数判断 
  40.     if ( !is_array($config) OR count($config) == 0) { 
  41.       if ($this->debug === TRUE) { 
  42.         $this->_log("sort_init_param_invaild"); 
  43.       } 
  44.       return FALSE; 
  45.     } 
  46.     //初始化成员变量 
  47.     foreach ($config as $key => $val) { 
  48.       if ( isset($this->$key)) { 
  49.         $this->$key = $val
  50.       } 
  51.     } 
  52.     //调用相应的成员方法完成排序 
  53.     $method = $this->sort . $this->marker; 
  54.     if ( ! method_exists($this$method)) { 
  55.       if ($this->debug === TRUE) { 
  56.         $this->_log("sort_method_invaild"); 
  57.       } 
  58.       return FALSE; 
  59.     } 
  60.     if ( FALSE === ($this->arr = $this->$method($this->arr))) 
  61.       return FALSE; 
  62.     return TRUE; 
  63.   } 
  64.   /** 
  65.    * 插入排序 
  66.    *  
  67.    * @param  array 
  68.    * @return bool 
  69.    */ 
  70.   private function insert_sort($arr) { 
  71.     //参数判断 
  72.     if ( ! is_array($arr) OR count($arr) == 0) { 
  73.       if ($this->debug === TRUE) { 
  74.         $this->_log("sort_array(insert)_invaild"); 
  75.       } 
  76.       return FALSE; 
  77.     } 
  78.     //具体实现 
  79.     $count = count($arr); 
  80.     for ($i = 1; $i < $count$i++) { 
  81.       $tmp = $arr[$i]; 
  82.       for($j = $i-1; $j >= 0; $j--) {  
  83.         if($arr[$j] > $tmp) { 
  84.           $arr[$j+1] = $arr[$j]; 
  85.           $arr[$j] = $tmp
  86.         } 
  87.       } 
  88.     } 
  89.     return $arr
  90.   } 
  91.   /** 
  92.    * 选择排序 
  93.    *  
  94.    * @param  array 
  95.    * @return bool 
  96.    */ 
  97.   private function select_sort($arr) { 
  98.     //参数判断 
  99.     if ( ! is_array($arr) OR count($arr) == 0) { 
  100.       if ($this->debug === TRUE) { 
  101.         $this->_log("sort_array(select)_invaild"); 
  102.       } 
  103.       return FALSE; 
  104.     } 
  105.     //具体实现 
  106.     $count = count($arr); 
  107.     for ($i = 0; $i < $count-1; $i++) { 
  108.       $min = $i
  109.       for ($j = $i+1; $j < $count$j++) { 
  110.         if ($arr[$min] > $arr[$j]) $min = $j
  111.       } 
  112.       if ($min != $i) { 
  113.         $tmp = $arr[$min]; 
  114.         $arr[$min] = $arr[$i]; 
  115.         $arr[$i] = $tmp
  116.       } 
  117.     } 
  118.     return $arr
  119.   } 
  120.   /** 
  121.    * 冒泡排序 
  122.    *  
  123.    * @param  array 
  124.    * @return bool 
  125.    */ 
  126.   private function bubble_sort($arr) { 
  127.     //参数判断 
  128.     if ( ! is_array($arr) OR count($arr) == 0) { 
  129.       if ($this->debug === TRUE) { 
  130.         $this->_log("sort_array(bubble)_invaild"); 
  131.       } 
  132.       return FALSE; 
  133.     } 
  134.     //具体实现 
  135.     $count = count($arr); 
  136.     for ($i = 0; $i < $count$i++) { 
  137.       for ($j = $count-1; $j > $i$j--) { 
  138.         if ($arr[$j] < $arr[$j-1]) { 
  139.           $tmp = $arr[$j]; 
  140.           $arr[$j] = $arr[$j-1]; 
  141.           $arr[$j-1] = $tmp
  142.         } 
  143.       } 
  144.     } 
  145.     return $arr;   
  146.   } 
  147.   /** 
  148.    * 快速排序 
  149.    *  
  150.    * @param  array 
  151.    * @return bool 
  152.    */ 
  153.   private function quick_sort($arr) { 
  154.     //具体实现 
  155.     if (count($arr) <= 1) return $arr;  
  156.     $key = $arr[0]; 
  157.     $left_arr = array(); 
  158.     $right_arr = array(); 
  159.     for ($i = 1; $i < count($arr); $i++){ 
  160.       if ($arr[$i] <= $key
  161.         $left_arr[] = $arr[$i]; 
  162.       else 
  163.         $right_arr[] = $arr[$i]; 
  164.     } 
  165.     $left_arr = $this->quick_sort($left_arr); 
  166.     $right_arr = $this->quick_sort($right_arr);  
  167.    
  168.     return array_merge($left_arrarray($key), $right_arr); 
  169.   } 
  170.   /** 
  171.    * 日志记录 
  172.    */ 
  173.   private function _log($msg) { 
  174.     $msg = 'date[' . date('Y-m-d H:i:s') . '] ' . $msg . '\n'
  175.     return @file_put_contents('sort_err.log'$msg, FILE_APPEND); 
  176.   } 
  177. /*End of file sort.php*/ 
  178. /*Location htdocs/sort.php */ 

2. sort_demo.php文件如下:

  1. <?php 
  2. require_once('sort.php'); 
  3. $config = array ( 
  4.   'arr' => array(23, 22, 41, 18, 20, 12, 200303,2200,1192) , 
  5.   //需要排序的数组值 
  6.   'sort' => 'select'
  7.   //可能值: insert, select, bubble, quick 
  8.   'debug' => TRUE 
  9.   //可能值: TRUE, FALSE 
  10. ); 
  11. $sort = new Sort($config); 
  12. //var_dump($config['arr']); 
  13. var_dump($sort->display()); 
  14. /*End of php*/

Tags: PHP排序算法类

分享到: