就如同拿到一摞乱扑克牌时候要在手里将顺序整理好一样,直接插入排序(Straight Insertion Sort)的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。

复杂度分析:

从空间来看,它需要一个记录的辅助空间O(n)(其实不需要也可以,直接在原数组中进行滑动操作,将目前要执行的元素current向前滑动到它对应的位置,此时不需要额外空间即O(1)),因此关键是看它的时间复杂度。当最好的情况,也就是要排序的表本身就是有序的,我们就相当于遍历了一遍数组,只是执行了大循环,内部小循环一直都未进行,而如果是最坏的情况,即排序表示逆序的,此时需要比较的次数就是 n * (n + 1)/2,需要移动的次数也是这些。如果排序记录是随机的,那么根据概率性相同的原则,平均比较和移动的次数约为 n * n / 4次。因此我们得出直接插入排序法的时间复杂度为O(n*n)。从这里可以看出,同样的O(n*n)的时间复杂度,直接插入排序法比冒泡法和简单选择排序法的性能要好一些。

下面看一下用php实现的该算法:

<?php
header("content-type:text/html;charset=utf-8");
/** 插入法排序:* 每一个位置的值向前滑动,挨个与它之前的值进行比较,插到合适的位置* 时间复杂度:与数据情况有关* 最好的情况:O(N);* 最差的情况:O(N^2)* 额外空间复杂度O(1)* */function insertSort($arr){if($arr == null || count($arr)<2){return true;}for($current=1;$current<count($arr);$current++){    //current为目前要进行插入操作的数字,0位置不需要再插入了,所以从1开始for($i = $current;$i>0 && $arr[$i-1]>$arr[$i];$i--){ //i>0保证往前滑比较的时候不越界,$arr[$i-1]>$arr[$i] 表示要进行插入操作的数字i与它前面的那个数进行比较,//如果比它小就往前滑,所以执行i--,继续和它前一个数比较,直到插进适合它的位置swap($arr,$i-1,$i);}}return $arr;
}function swap(&$arr,$i,$j){  //注意这里引用变量的使用$tem = $arr[$i];$arr[$i] = $arr[$j];$arr[$j] = $tem;
}$arr = [2,33,45,22,64,67,12,1,0,9];
$array = insertSort($arr);
print_r($array);//结果:Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 9 [4] => 12 [5] => 22 [6] => 33 [7] => 45 [8] => 64 [9] => 67 )

转载于:https://www.cnblogs.com/xlzfdddd/p/10475495.html

8.3 直接插入排序相关推荐

  1. java 折半插入排序_[Java代码] Java实现直接插入排序和折半插入排序算法示例

    1 排序思想: 将待排序的记录Ri插入到已经排好序的记录R1,R2,--,R(N-1)中. 对于一个随机序列而言,就是从第二个元素开始,依次将这个元素插入到它之前的元素中的相应位置.它之前的元素已经排 ...

  2. 直接插入排序与希尔排序

    直接插入排序(Straight Insertion Sort):         一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的.记录数量增1的有序表. 原理图如 ...

  3. 排序算法之直接插入排序

    1.基本思想: 已知待排序列r[1...n],先将序列中的第一个记录看成是一个有序的子序列,然后从第二个记录起逐个进行插入,直至整个序列变成关键字非递减有序序列为止. 具体操作如下: (1)查找出r[ ...

  4. c语言 静态链表插入排序,数据结构C语言版 表插入排序

    西门豹治邺奇计 数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P2 ...

  5. 插入排序,希尔排序,堆排序

    本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...

  6. 问题 c: 插入排序_插入排序:它是什么,以及它如何工作

    问题 c: 插入排序 Insertion sort is a simple sorting algorithm for a small number of elements. 插入排序是一种针对少量元 ...

  7. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  8. 三种基本排序的实现及其效率对比:冒泡排序、选择排序和插入排序

    1 public class ThreeTypesOfBaseSort { 2 // ========================== 三种基本排序的效率对比 ================== ...

  9. python插入排序演示源码

    工作闲暇时间,把写内容过程较好的内容段做个备份,下面的内容内容是关于python插入排序演示的内容,应该能对各朋友也有用处. def insert_sort(t): for i in xrange(l ...

  10. 【算法导论】插入排序

    循环不变式 在数学上阐述了通过循环(迭代,递归)去计算一个累计的目标值的正确性. 关于循环不变式,我们必须要证明三条性质: 初始化:循环第一次迭代之前,它为真. 保持:如果循环的某次迭代之前它为真,那 ...

最新文章

  1. Redis主从复制配置
  2. 《强化学习周刊》第2期:多智能体强化学习(MARL)赋能“AI智能时代”
  3. HDU - 6082 度度熊与邪恶大魔王(背包变式)
  4. 【学术相关】不喜欢做研究,到底要不要读博士?
  5. 反射与泛型 java_Java的反射 和 泛型的一个问题
  6. androidannotations 在android studio中的使用
  7. 前端实现红包雨功能_微信隐藏的7个实用功能,你都知道吗?真的白玩这么久微信...
  8. 20165329 Java实验四 Android程序设计
  9. C/C++心得-从内存开始
  10. python通过什么对象连接数据库_介绍Python 数据库的Connection、Cursor两大对象
  11. Java Graphics2D 在图片上画(微信昵称)含有特殊符号(Emoji)的文字
  12. 用于微信小程序的图文编辑器
  13. c语言输入星期的首字母,10、实现中英文的转换,输入汉语星期几,输出该星期的英文名。可以用指针数组处理字符串。C语言...
  14. 服务器独享宽带和共享宽带有那些区别
  15. 《运营之光3.0》全新上市——跨越时代,自我颠覆的诚意之作
  16. 数字图像处理 第八章 图像压缩
  17. python+sklearn实现决策树模型
  18. ros ubuntu 卸载_ROS安装与卸载
  19. 操作系统原理——(1)引言:计算机系统和操作系统概述
  20. Java设计模式学习笔记:单例模式(一)

热门文章

  1. 工作日志——k8s pvpvc
  2. AC日记——双栈排序 洛谷 P1155
  3. bootstrap 模态框垂直居中实现方法
  4. Spring MVC不要在@Service bean中保存状态
  5. what can be learned from a friend?
  6. characteriscation in English debate
  7. IEEE R10 Event Funding Portal
  8. xjtlu mac mail 绑定
  9. 利物浦大学的vlog网站
  10. 一个非常奇怪的C++拷贝构造函数问题