美文网首页
(307)排序-插入排序

(307)排序-插入排序

作者: 林湾村龙猫 | 来源:发表于2016-01-21 01:08 被阅读69次

概述

插入排序比较
  插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。
  如果输入数组已经是排好序的话,插入排序出现最佳情况,其运行时间是输入规模的一个线性函数。如果输入数组是逆序排列的,将出现最坏情况。平均情况与最坏情况一样,其时间代价是Θ(n2)。
  也许你没有意识到,但其实你的思考过程是这样的:现在抓到一张7,把它和手里的牌从右到左依次比较,7比10小,应该再往左插,7比5大,好,就插这里。为什么比较了10和5就可以确定7的位置?为什么不用再比较左边的4和2呢?因为这里有一个重要的前提:手里的牌已经是排好序的。现在我插了7之后,手里的牌仍然是排好序的,下次再抓到的牌还可以用这个方法插入。编程对一个数组进行插入排序也是同样道理,但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。
插入排序类似于整理扑克牌,从无序列中选择一个值插入到有序列中

理论

http://www.cnblogs.com/fanyong/archive/2012/03/23/2413553.html
http://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F

动画

插入排序动画1
插入排序动画2

代码(PHP)

插入排序

//简单插入排序(O(n2))
function insertSort($arr){//升序排列
    $length = count($arr);
    if($length <= 1){//输入数组至少有两个值
        return $arr;
    }

    $sort_arr = array($arr[0],$arr[1]);
    if($arr[0]>$arr[1]){
        list($sort_arr[0],$sort_arr[1]) = array($sort_arr[1],$sort_arr[0]);
    }
    for($i=2;$i<$length;$i++){
        $sort_length = count($sort_arr);
        $sort_arr[$sort_length]= null;
        for($j=$sort_length-1;$j >= 0;$j--){
            if($sort_arr[$j] > $arr[$i]){
                $sort_arr[$j+1] = $sort_arr[$j];
            }else{
                $sort_arr[$j+1] = $arr[$i];
                break;
            }
        }
        if($j==-1){
            $sort_arr[0] = $arr[$i];
        }
    }
    return $sort_arr;
}

调用

$item =array('2','1','4','3','8','6','5','-1','10','3','7','6','6');
var_dump(implode(',',$item));
var_dump(implode(',',insertSort($item)));

结果

插入排序

相关文章

  • (307)排序-插入排序

    概述 理论 http://www.cnblogs.com/fanyong/archive/2012/03/23/2...

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

  • c算法O(n)^2(一)

    选择排序 插入排序 优化插入排序算法

  • java快速学习排序---插入排序

    1.java实现插入排序 (1)、图解插入排序 (2)、插入排序的思想 (3)、插入排序的代码实现

  • 算法(排序)

    一、内部排序 1、插入排序—直接插入排序(Straight Insertion Sort) 2、插入排序—希尔排序...

  • Java排序算法

    插入排序 直接插入排序 折半插入排序 交换排序 冒泡排序 快速排序 选择排序 简单选择排序 堆排序 其他排序 二路...

  • 一遍文章搞定插入排序-java版

    插入排序 1.1 插入排序的基本介绍 插入排序属于内排,就是以插入的方式来达到排序的目的 1.2 插入排序思想 将...

  • 排序(新排版)

    冒泡排序 插入排序 二分插入排序 希尔排序 选择排序 快速排序

  • iOS算法

    排序方法 选择排序:直接选择排序、堆排序。 交换排序:冒泡排序、快速排序。 插入排序:直接插入排序、二分法插入排序...

  • Java学习记录(常用 算法 排序 )

    排序算法的分类如下: 1.插入排序(直接插入排序、折半插入排序、希尔排序);2.交换排序(冒泡泡排序、快速排序);...

网友评论

      本文标题:(307)排序-插入排序

      本文链接:https://www.haomeiwen.com/subject/joylkttx.html