插入排序PHP实现

插入排序是一种朴素的直观的算法。算法在从后向前扫描数据的过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

用一个动画来表示插入排序的过程:

插入排序动画

插入排序动画

下面是对应的可运行的面向对象的一个PHP插入排序类的代码示例:

  1. <?php
  2. // 定义插入排序类
  3. class InsertionSort{
  4.  
  5.     private $result = array();
  6.     private $order = 'ASC'// 'ASC' or 'DESC'
  7.  
  8.     // 构造函数
  9.     public function __construct($arr$order){
  10.         if(!empty($order)){
  11.             $this->order = $order;
  12.         }
  13.         $this->result = $this->insertion_sort($arr);
  14.     }
  15.  
  16.     public function get_result(){
  17.         return $this->result;
  18.     }
  19.  
  20.     private function insertion_sort($arr){
  21.         foreach($arr as $k=>$v){
  22.             $i = $k-1;
  23.             if($this->order == 'DESC'){
  24.                 while($i>-1 && $v>$arr[$i]){
  25.                     $this->exchange_arr_item($arr$i);
  26.                     $i--;
  27.                 }
  28.             }else{
  29.                 while($i>-1 && $v<$arr[$i]){
  30.                     $this->exchange_arr_item($arr$i);
  31.                     $i--;
  32.                 }
  33.             }
  34.         }
  35.         return $arr;
  36.     }
  37.  
  38.     private function exchange_arr_item(&$arr$i){
  39.         // 以$temp为中间变量,交换前后两个元素
  40.         $temp = $arr[$i+1];
  41.         $arr[$i+1] = $arr[$i];
  42.         $arr[$i] = $temp;
  43.     }
  44. }
  45.  
  46.  
  47. $arr = array(65318724);
  48.  
  49. // 调用插入排序类
  50. $sort_asc = new InsertionSort($arr'ASC');
  51. $sort_desc = new InsertionSort($arr'DESC');
  52.  
  53. $arr = $sort_asc->get_result();
  54. var_export($arr);
  55.  
  56. $arr = $sort_desc->get_result();
  57. var_export($arr);
  58. ?>

输出的结果是:

  1. // ASC
  2. array (
  3.   0 => 1,
  4.   1 => 2,
  5.   2 => 3,
  6.   3 => 4,
  7.   4 => 5,
  8.   5 => 6,
  9.   6 => 7,
  10.   7 => 8,
  11. );
  12.  
  13. // DESC
  14. array (
  15.   0 => 8,
  16.   1 => 7,
  17.   2 => 6,
  18.   3 => 5,
  19.   4 => 4,
  20.   5 => 3,
  21.   6 => 2,
  22.   7 => 1,
  23. );

再来一张图来走一遍插入排序的流程:

插入排序流程

插入排序流程

插入排序特性:

  • 最差时间复杂度: O(n2)
  • 最优时间复杂度: O(n)
  • 平均时间复杂度: O(n2)
  • 最差空间复杂度: 总共O(n) ,需要辅助空间O(1)
  • 排序是否稳定的: 是

Fancy点评:

插入排序只是初学者开始学习算法及排序的一个简单引导,目的在于帮助我们初始算法并了解算法的时间复杂度、空间复杂度等知识。在实际的应用中这个算法基本没有表演的舞台。

 

转自:http://www.fancycedar.info/2013/05/insertion-sort-php-example/

posted @ 2013-06-09 14:59  chen1706  阅读(86)  评论(0)    收藏  举报