插入排序PHP实现
插入排序是一种朴素的直观的算法。算法在从后向前扫描数据的过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
用一个动画来表示插入排序的过程:
下面是对应的可运行的面向对象的一个PHP插入排序类的代码示例:
- <?php
- // 定义插入排序类
- class InsertionSort{
- private $result = array();
- private $order = 'ASC'; // 'ASC' or 'DESC'
- // 构造函数
- public function __construct($arr, $order){
- if(!empty($order)){
- $this->order = $order;
- }
- $this->result = $this->insertion_sort($arr);
- }
- public function get_result(){
- return $this->result;
- }
- private function insertion_sort($arr){
- foreach($arr as $k=>$v){
- $i = $k-1;
- if($this->order == 'DESC'){
- while($i>-1 && $v>$arr[$i]){
- $this->exchange_arr_item($arr, $i);
- $i--;
- }
- }else{
- while($i>-1 && $v<$arr[$i]){
- $this->exchange_arr_item($arr, $i);
- $i--;
- }
- }
- }
- return $arr;
- }
- private function exchange_arr_item(&$arr, $i){
- // 以$temp为中间变量,交换前后两个元素
- $temp = $arr[$i+1];
- $arr[$i+1] = $arr[$i];
- $arr[$i] = $temp;
- }
- }
- $arr = array(6, 5, 3, 1, 8, 7, 2, 4);
- // 调用插入排序类
- $sort_asc = new InsertionSort($arr, 'ASC');
- $sort_desc = new InsertionSort($arr, 'DESC');
- $arr = $sort_asc->get_result();
- var_export($arr);
- $arr = $sort_desc->get_result();
- var_export($arr);
- ?>
输出的结果是:
- // ASC
- array (
- 0 => 1,
- 1 => 2,
- 2 => 3,
- 3 => 4,
- 4 => 5,
- 5 => 6,
- 6 => 7,
- 7 => 8,
- );
- // DESC
- array (
- 0 => 8,
- 1 => 7,
- 2 => 6,
- 3 => 5,
- 4 => 4,
- 5 => 3,
- 6 => 2,
- 7 => 1,
- );
再来一张图来走一遍插入排序的流程:
插入排序特性:
- 最差时间复杂度: O(n2)
- 最优时间复杂度: O(n)
- 平均时间复杂度: O(n2)
- 最差空间复杂度: 总共O(n) ,需要辅助空间O(1)
- 排序是否稳定的: 是
Fancy点评:
插入排序只是初学者开始学习算法及排序的一个简单引导,目的在于帮助我们初始算法并了解算法的时间复杂度、空间复杂度等知识。在实际的应用中这个算法基本没有表演的舞台。
转自:http://www.fancycedar.info/2013/05/insertion-sort-php-example/


浙公网安备 33010602011771号