直接插入排序的基本思想:每趟将一个待排元素作为关键字,按照其关键字值得大小插入到已经排好序的部分序列的适当位置,直到插入完成


算法思想总结如下:(设待排序的数组为a[0…n-1])

1、初始时,a[0]就是第一个有序区间,无序区间为a[1…n-1];
2、将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间;
3、i++并重复第二步,知道i=n-1,此时排序完成。


直接插入排序基本算法实现如下

void insertSort1(int[] a,int n){int i,j,temp;//第一个元素有序,所以从第二个开始处理for (i = 1; i < n; i++) {temp = a[i];//将待排元素暂存于temp中j = i - 1;//从待排元素之前的元素开始扫描,如果大于待排元素,则后移一位while(j >= 0 && a[j] > temp){a[j + 1] = a[j];j--;}//找到插入位置,将temp中暂存的待排元素插入a[j + 1] = temp;}}

java代码实现如下

public class InsertSort {public static void main(String[] args) {int[] a = {5,2,9,6,8,4,3,0};insertSort1(a,8);for (int i = 0; i < a.length; i++) {System.out.println(a[i]);}System.out.println("**************");int[] b = {5,2,9,6,8,4,3,0};insertSort2(b,8);for (int i = 0; i < b.length; i++) {System.out.println(b[i]);}}public static void insertSort1(int[] a,int n){int i,j,temp;//第一个元素有序,所以从第二个开始处理for (i = 1; i < n; i++) {temp = a[i];//将待排元素暂存于temp中j = i - 1;//从待排元素之前的元素开始扫描,如果大于待排元素,则后移一位while(j >= 0 && a[j] > temp){a[j + 1] = a[j];j--;}//找到插入位置,将temp中暂存的待排元素插入a[j + 1] = temp;}}public static void insertSort2(int[] a, int n){int i,j;for (i = 1; i < n; i++) {if (a[i] < a[i-1]) {int temp = a[i];for (j = i-1; j >= 0 && a[j] > temp; j--) {a[j+1] = a[j];}a[j+1] = temp;}}}
}

时间复杂度

考虑最坏的情况,即整个序列式逆序的,则内层循环temp < a[j]这个条件是始终成立的。此时,对于每一次外层循环,最内层循环的执行次数(也就是基本操作a[j+1] = a[j] 的执行次数)达到最大值,为i次,i的取值范围为2~n,由此可得基本操作总的执行次数为n(n-1)/2,时间复杂度为O(n2){n的平方}

考虑最好的情况,即整个序列已经是有序序列,则对于内层循环temp < a[j]这个条件是始终不成立的。此时内层循环始终不执行,时间复杂度为**重点内容**0(n)。


空间复杂度

由算法代码可知,算法所需的额外空间只有一个temp,因此它的空间复杂度为0(1)

【大话数据结构算法】直接插入排序相关推荐

  1. 【大话数据结构算法】希尔排序

    希尔排序的实质就是分组插入排序,该方法又称为缩小增量排序. 直接插入排序适合于序列基本有序的情况,希尔排序的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了,再来一趟直接插入排序,这样会使排序 ...

  2. 大话数据结构——算法

    算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 为什么把数据结构和算法一起说? 想想罗密欧与朱丽叶,梁山伯和祝英台,少了一个你总会觉得奇怪吧. ...

  3. 【大话数据结构算法】查找算法

    顺序查找 针对无序序列的一种最简单的查找方式. 算法思想: 从表中第一个记录开始,逐个与给定值进行比较,若某个记录的关键字和给定值相等,则查找成功:反之,若直到最后一个记录,其关键字和给定值都不相等, ...

  4. 【大话数据结构算法】归并排序

    归并排序算法的基本步骤: 1.把0~length-1的数组分成左数组和右数组: 2.对左数组和右数组进行迭代排序: 3.将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组. 归并排序基本算 ...

  5. 【大话数据结构算法】直接选择排序

    选择类排序的主要动作是"选择",直接选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个记录,和第一个记录交换,接着从剩下的记录中继续这种选择和交换,最终使序列有序. ...

  6. 【大话数据结构算法】冒泡排序

    起泡排序又称为冒泡排序.它是通过一系列的"交换"动作完成的.首先将第一和第二个记录进行比较,如果第一个记录大于第二个记录,则两者交换位置,否则保持原位置不变:然后比较第二和第三个记 ...

  7. 【大话数据结构算法】快速排序算法

    快速排序是交换类的排序,比如在站队的时候,老师说:"第一个同学出列,其他同学以第一个同学为中心,比他矮的全排在左边,比他高的全排在右边."这就是一趟快速排序.可以看出,一趟快速排序 ...

  8. 【大话数据结构算法】哈夫曼树

    哈夫曼树又称为最优二叉树. 1.路径和路径长度 在一棵树中,从一个节点往下可以达到的孩子或者子孙节点之间的通路称为路径.通路中分支的数目称为路径长度.若规定根节点的层数为1,则从根节点 到第L层节点的 ...

  9. 大话数据结构及JAVA数据结构阅读笔记

    目录 一.大话数据结构随书阅读笔记 第一章 数据结构概述 第二章  算法概述 第三章 线性表 第四章 栈与队列 第五章 串 第六章 树 第七章 图 第八章 查找 第九章 排序 二.大话数据结构思维导图 ...

最新文章

  1. 只懂JavaScript也可以开发VR/AR内容了!
  2. android中心点旋转晃动_Android:如何在中心点上旋转位图
  3. Boost.MultiIndex 使用散列索引的示例
  4. 去除img之间的空白
  5. 关于 HANA CE Function
  6. python入门(5)使用文件编辑器编写代码并保存执行
  7. 1._请写出5种以上的android中界面常用布局方式,跳槽季“充电宝”Android面试题(一)...
  8. for mew歌词 shell_求shell for mew的中文歌词
  9. linux的一些目录结构
  10. tp框架 < 5.0.24漏洞
  11. CCS软件报错“unresolved symbol remain”
  12. Ubuntu16.04 Caffe 安装步骤记录
  13. 主板检测卡c5_主板测试卡代码及解决方法
  14. excel选择性粘贴为何是html,选择性粘贴,教您excel选择性粘贴怎么用
  15. 网页中使用的特殊字体(webdings, wingdings 2)续
  16. CentOS7+VMware 14的安装教程
  17. 3D模型欣赏:MR4概念机器人 材质处理细致,金属质感细致
  18. 微信小程序 - excel通过云函数导入云数据库
  19. nano编辑器的使用
  20. Q1财报之后,美团继续看未来

热门文章

  1. 搞大了,修改一个参数后重启数据库服务器出错CRS-0184
  2. Android 4.0 截屏(Screenshot)代码流程小结
  3. android Formatter 的使用
  4. android Android项目构建过程
  5. WebKit DOM Event (二)
  6. Springboot搭建个人博客系列
  7. Python如何打包EXE可执行文件
  8. Flutter Web:Shadow Root问题
  9. MySql 中锁的定义
  10. java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/FilterRegistrationBean