排序思路:每次将一个待排序的元素与已排序的元素进行逐一比较,直到找到合适的位置按大小插入。

第一趟比较示图:

算法实现:

public static void insertsort(int arr[]){                for(int i = 1;i < arr.length; i ++){if(arr[i] < arr[i-1]){//注意[0,i-1]都是有序的。如果待插入元素比arr[i-1]还大则无需再与[i-1]前面的元素进行比较了,反之则进入if语句int temp = arr[i];int j;for(j = i-1; j >= 0 && arr[j] > temp; j --){                arr[j+1] = arr[j];//把比temp大或相等的元素全部往后移动一个位置
                }arr[j+1] = temp;//把待排序的元素temp插入腾出位置的(j+1)
            }            }}public static void main(String[] args) {int array[] = {4,2,1,5};System.out.println("排序之前:");for(int element : array){System.out.print(element+" ");}insertsort(array);System.out.println("\n排序之后:");        for(int element : array){System.out.print(element+" ");}}
}

结果:

排序之前:
4 2 1 5
排序之后:
1 2 4 5 

算法分析:1.当元素的初始序列为正序时,仅外循环要进行n-1趟排序且每一趟只进行一次比较,没有进入if语句不存在元素之间的交换(移动)。此时比较次数(Cmin)和移动次数(Mmin)达到最小值。

Cmin = n-1    Mmin = 0;

此时时间复杂度为O(n)。

2.当元素的初始序列为反序时,每趟排序中待插入的元素都要和[0,i-1]中的i个元素进行比较且要将这i个元素后移(arr[j+1] = arr[j]),i个元素后移移动次数当然也就为i了,再加上temp = arr[i]与arr[j+1] = temp的两次移动,每趟移动的次数为i+2,此时比较次数(Cmin)和移动次数(Mmin)达到最小值。

Cmax = 1+2+...+(n-1) = n*(n-1)/2 = O(n2)

Mmax = (1+2)+(2+2)+...+(n-1+2) = (n-1)*(n+4)/2 = O(n2)  (i取值范围1~n-1)

此时时间复杂度为O(n2)。

3.在直接插入排序中只使用了i,j,temp这3个辅助元素,与问题规模无关,所以空间复杂度为O(1).

4.在整个排序结束后,即使有相同元素它们的相对位置也没有发生变化,

如:5,3,2,3排序过程如下

A--3,5,2,3

B--2,3,5,3

C--2,3,3,5

排序结束后两个元素3的相对位置没有发生改变,所以直接插入排序是一种稳定排序。

转自:http://www.cnblogs.com/MOBIN/p/4679208.html

转载于:https://www.cnblogs.com/longqingyang/p/6950569.html

图解插入排序--直接插入排序相关推荐

  1. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  2. 王道八大排序:直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 归并排序 基数排序

    文章目录 1.插入排序 1.1直接插入排序 1.2折半插入排序 1.3希尔排序 2.交换排序 2.1冒泡排序 2.2快速排序 3.选择排序 3.1简单选择排序 3.2堆排序 4.归并排序 5.基数排序 ...

  3. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

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

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

  5. 插入排序 - 二分插入排序

    二分插入是直接插入排序的一种优化,主要是查找方式不同. 稳定性:稳定的 时间复杂度:O(n^2) public class BinaryInsertSort {public static void m ...

  6. python插入排序_python 插入排序,选择排序

    插入排序: def insert_sort(lst): for i in range(1,len(lst)): x=lst[i] #x是一个临时变量,表示当前轮到的数字 j=i #临时变量 j ,为后 ...

  7. 插入排序---希尔插入排序算法(Javascript版)

    取一个小于n的整数作为第一个增量,把序列分组.所有距离为增量的倍数的元素放在同一个组中.先在各组内进行直接插入排序:然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1, ...

  8. 插入排序:直接插入排序希尔排序

    一.直接插入排序 1. 思想 直接排序法, 可以分为两个部分, 一部分是有序的, 一部分是无序的. 从这个图上, 应该是能看清楚直接插入排序的思想了. 将无序部分的第一个与有序部分进行比较. 从有序部 ...

  9. java sort 插入排序_插入排序(insertSort)

    插入排序,在数组中,保证 从位置0 到 p 位置 配上的元素都是已排序状态.每次比较 p+1 位置上的元素和已排序的列表,将 p+1 位置上的元素,加入到已排序的列表中. /** * created ...

最新文章

  1. rs232串口驱动_LED驱动电路设计
  2. 如何用初中知识理解机器学习到底在干什么事情
  3. 想学python-为什么现在那么多人想学Python?
  4. leetcode-----给出两个二叉树,请写出一个判断两个二叉树是否相等的函数。
  5. 七个步骤,带你快速读懂 RPC 框架原理
  6. 《机器学习实战》朴素贝叶斯
  7. Java AOP学习之method invoke of class JdkDynamicAopProxy
  8. python对列表中的数值进行统计运算_python-从单词列表中计算元音并返回数字作......
  9. python 四足机器人运动学_撸了个四足机器人
  10. Qt工作笔记-profile中INSTALLS的使用
  11. java applet怎么传参,使用不带浏览器的参数运行java applet
  12. 免费网课python_Python网课推荐——免费学习Python编程
  13. 付费版百度指数 就是这么坑爹
  14. vue2和vue3 的 keep-alive的用法
  15. Android动画内置插值器
  16. 我现在的笔记有哪几个地方?
  17. Component(组件)的创建
  18. MATLAB resample()函数
  19. 图神经网络 | (8)图注意力网络(GAT)
  20. 知乎周源微信_每周源代码30-具有XML文字的VB.NET作为ASP.NET MVC的视图引擎

热门文章

  1. 【Spring】【JUnit】单元测试
  2. HDU 1425 sort(堆排序)
  3. 检查数据库的CPU和PSU补丁信息
  4. iPhone开发进阶(9)--- 用SQLite管理数据库
  5. 微型计算机2013年10月下,微型计算机及接口技术2013年10月真题试题(04732)
  6. matlab将二值图像与原图重叠_[转载]图像处理matlab及图像融合图像镶嵌图像拼接...
  7. python爬取学校题库_如何使用 Python 爬虫爬取牛客网 Java 题库?
  8. php windows 编译,Windows编译PHP7.2拓展
  9. python 结果写入excel_python中如何将测试结果写入到原有的excel表格(二)
  10. 服务器系统linux怎么安装教程,CentOS 8.0.1905 linux服务器系统安装与配置图解教程...