【问题描述】

1.给定任意乱序整型数组,要求使用插入排序算法将其元素按照从小到大的顺序排列。

2.说明其时间复杂度和空间复杂度

3.分析其稳定性

【问题解决】

1.插入排序算法实现代码:

package algorithm;public class InsertionSort {public static void main(String[] args) {int[] arr= {9,4,3,1,3,7,8,6,2,5};insertionSort(arr);printIntArray(arr);}//插入排序static void insertionSort(int[] arr) {for(int i=0;i<arr.length;i++) {for (int j = i; j>0; j--) {if(arr[j]<arr[j-1]) {swapIntArray(arr, j, j-1);}}}}//打印整型数组public static void printIntArray(int[] arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();}//交换整型数组指定位置的元素public static void swapIntArray(int[] arr,int i,int j) {int temp = arr[i];arr[i]=arr[j];arr[j]=temp;}
}

执行结果:

1 2 3 3 4 5 6 7 8 9 

2.插入排序除了自身固定的空间外没有使用额外的空间,所以空间复杂度为。时间复杂度为,最好时间复杂度为。速度上几乎要快冒泡排序一倍,比选择排序效率要高,对于样本较小且基本有序的时候,使用插入排序的效率还是比较可观的。

3.在上列代码中编写打印语句,观察插入排序的排序过程:

package algorithm;public class InsertionSort {public static void main(String[] args) {int[] arr= {9,4,3,1,3,7,8,6,2,5};insertionSort(arr);printIntArray(arr);}//插入排序static void insertionSort(int[] arr) {for(int i=0;i<arr.length;i++) {if(i!=0) {System.out.println("-------------------------------------------------------");System.out.print("第"+(i)+"次排序前:");printIntArray(arr);System.out.print("第"+(i)+"次排序:");}for (int j = i; j>0; j--) {if(arr[j]<arr[j-1]) {swapIntArray(arr, j, j-1);System.out.print("索引["+(j-1)+"]与["+j+"]即元素‘"+arr[j-1]+"’与‘"+arr[j]+"’交换:");printIntArray(arr);}}}}//打印整型数组public static void printIntArray(int[] arr){for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.println();}//交换整型数组指定位置的元素public static void swapIntArray(int[] arr,int i,int j) {int temp = arr[i];arr[i]=arr[j];arr[j]=temp;}
}

执行结果:

-------------------------------------------------------
第1次排序前:9 4 3 1 3 7 8 6 2 5
第1次排序:索引[0]与[1]即元素‘4’与‘9’交换:4 9 3 1 3 7 8 6 2 5
-------------------------------------------------------
第2次排序前:4 9 3 1 3 7 8 6 2 5
第2次排序:索引[1]与[2]即元素‘3’与‘9’交换:4 3 9 1 3 7 8 6 2 5
索引[0]与[1]即元素‘3’与‘4’交换:3 4 9 1 3 7 8 6 2 5
-------------------------------------------------------
第3次排序前:3 4 9 1 3 7 8 6 2 5
第3次排序:索引[2]与[3]即元素‘1’与‘9’交换:3 4 1 9 3 7 8 6 2 5
索引[1]与[2]即元素‘1’与‘4’交换:3 1 4 9 3 7 8 6 2 5
索引[0]与[1]即元素‘1’与‘3’交换:1 3 4 9 3 7 8 6 2 5
-------------------------------------------------------
第4次排序前:1 3 4 9 3 7 8 6 2 5
第4次排序:索引[3]与[4]即元素‘3’与‘9’交换:1 3 4 3 9 7 8 6 2 5
索引[2]与[3]即元素‘3’与‘4’交换:1 3 3 4 9 7 8 6 2 5
-------------------------------------------------------
第5次排序前:1 3 3 4 9 7 8 6 2 5
第5次排序:索引[4]与[5]即元素‘7’与‘9’交换:1 3 3 4 7 9 8 6 2 5
-------------------------------------------------------
第6次排序前:1 3 3 4 7 9 8 6 2 5
第6次排序:索引[5]与[6]即元素‘8’与‘9’交换:1 3 3 4 7 8 9 6 2 5
-------------------------------------------------------
第7次排序前:1 3 3 4 7 8 9 6 2 5
第7次排序:索引[6]与[7]即元素‘6’与‘9’交换:1 3 3 4 7 8 6 9 2 5
索引[5]与[6]即元素‘6’与‘8’交换:1 3 3 4 7 6 8 9 2 5
索引[4]与[5]即元素‘6’与‘7’交换:1 3 3 4 6 7 8 9 2 5
-------------------------------------------------------
第8次排序前:1 3 3 4 6 7 8 9 2 5
第8次排序:索引[7]与[8]即元素‘2’与‘9’交换:1 3 3 4 6 7 8 2 9 5
索引[6]与[7]即元素‘2’与‘8’交换:1 3 3 4 6 7 2 8 9 5
索引[5]与[6]即元素‘2’与‘7’交换:1 3 3 4 6 2 7 8 9 5
索引[4]与[5]即元素‘2’与‘6’交换:1 3 3 4 2 6 7 8 9 5
索引[3]与[4]即元素‘2’与‘4’交换:1 3 3 2 4 6 7 8 9 5
索引[2]与[3]即元素‘2’与‘3’交换:1 3 2 3 4 6 7 8 9 5
索引[1]与[2]即元素‘2’与‘3’交换:1 2 3 3 4 6 7 8 9 5
-------------------------------------------------------
第9次排序前:1 2 3 3 4 6 7 8 9 5
第9次排序:索引[8]与[9]即元素‘5’与‘9’交换:1 2 3 3 4 6 7 8 5 9
索引[7]与[8]即元素‘5’与‘8’交换:1 2 3 3 4 6 7 5 8 9
索引[6]与[7]即元素‘5’与‘7’交换:1 2 3 3 4 6 5 7 8 9
索引[5]与[6]即元素‘5’与‘6’交换:1 2 3 3 4 5 6 7 8 9
1 2 3 3 4 5 6 7 8 9 

插入排序过程中,大小相同的元素,偶尔会由于交换而相离,但总体上会相互靠近,直到它们相互毗邻后,插入排序便不再改变它们的相互位置,所以插入排序是稳定的。

插入排序及其稳定性介绍相关推荐

  1. python算法与数据结构-插入排序算法(34)

    阅读目录 一.插入排序的介绍 二.插入排序的原理 三.插入排序的图解 四.插入排序的python代码实现 五.插入排序的C语言代码实现 六.插入排序的时间复杂度 七.插入排序的稳定性 一.插入排序的介 ...

  2. 数据结构--直接插入排序

    直接插入排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止.     本节介绍两种插入 ...

  3. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  4. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

  5. 各个排序算法的时间复杂度、稳定性、快排的原理以及图解

    目录 一.数据结构的八大排序算法总结笔记: 1.常见的数据结构排序算法如下图所示: 2.常见数据结构排序算法的时间复杂度.空间复杂度.稳定性介绍如下图所示: 二.排序算法逐一介绍: 1.直接插入排序: ...

  6. 十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序

    文章目录 一.冒泡排序 1.1 冒泡排序基础[必会知识] 1.2 冒泡排序优化 1.2.1 外循环优化 1.2.2 内循环优化 1.2.3 双向遍历 1.3 冒泡排序的稳定性.复杂度和适用场景 1.3 ...

  7. 存在就不插入_动画:面试官问我插入排序和冒泡排序哪个更牛逼?

    来自公众号:小鹿动画学编程 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序.还有一些其他经典的排序,小鹿整理的共有 ...

  8. java里怎么存入数据并进行排序_Java数据结构之排序---插入排序

    插入排序的基本介绍: 插入排序是对想要排序的序列以插入的方式寻找该元素的适当的位置,从而达到排序的目的. 插入排序的基本思想: 把n个待排序的元素看成一个有序表和一个无序表,开始时,有序表只有一个元素 ...

  9. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

最新文章

  1. 用sql语句实现按时间求累计值
  2. 【云计算的1024种玩法】轻松将其他云的对象储存迁移至阿里云OSS
  3. EXECL导入(检查服务器版本.包括NPOI方式导入.可以通过配置文件信息导入EXECL)代码记录下....
  4. docker中创建MySQL及在外部使用Navicat连接
  5. 利用python爬取房价
  6. 频谱扩展 matlab,简单的直接扩展频谱通信系统仿真分析
  7. VT技术开创普遍虚拟化计算时代
  8. ios图片放大之后如何不模糊_ios uiimageview的长宽放大3倍后 图片变模糊的问题
  9. 哪个专业学python语言_想学Python编程?你真的适合吗?
  10. spring boot要如何学习?
  11. apache2.4.7 make报错[exports.lo] Error 1 解决方法
  12. 中国农历2013,2014 (zz.IS2120@BG57IV3)
  13. Java最牛教材!甲骨文java认证考试试题
  14. 事业单位计算机常识PPT,计算机基础知识:PPT常用操作(六)
  15. 安装VMware提示“此产品安装程序不支持降级“
  16. spring事物配置备份
  17. Fabric 009 NodeJs Express安装与运行记录
  18. 中设智控牵手欧派,助力欧派提升设备管理水平
  19. OpenCV - 计算相机和视频的帧速率FPS
  20. Error:(63, 24) 错误: 枚举 switch case 标签必须为枚举常量的非限定名称

热门文章

  1. 切图工具:关于工具的几个概念
  2. AD10 如何将焊盘的实心改为十字型覆铜
  3. 人生思考--碌碌无为的一天
  4. 第二章 系统集成及服务管理知识点1
  5. 高通退出服务器芯片市场,华为会跟随退出么?
  6. matlab三维图、二维云图的可视化绘图
  7. 数学建模入门 方法及代码
  8. 安装YLMF OS 5.0
  9. matlab结果中有虚数,Matlab数值积分结果是虚数
  10. 【Google】谷歌浏览器升级后无法修改cookies信息