插入排序

也可叫直接插入排序,该算法的思路是:初始可认为文件中的第1个记录已排好序,然后将第2个到第n个记录依次插入到已排序的记录组成的文件中。

步骤:

假设有一组数组为(数组下标0—n-1):

arrays={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
一,从下标为1的数据(当前数据)开始遍历,而且之后往后移直到下标为n-1(数组的最后一位下标数据);
二,定义一个变量并保存当前数据;
三,当前数据与前面数据依次对比直到前面数据的下标为0,如果大于当前数据,则把前面的数据往右移一位;
四,每执行第三步后,将之前保存当前数据的变量赋值为给前面数据的下标加1.

流程图:

代码:

 public class TestInsert {
//直接插入排序
public static void insertSort(int[] arrays){
int i,j;
//从第二位开始遍历,(之后把第i位数据叫作当前数据)
for (i = 1; i <arrays.length; i++){
//保存当前数据为temp
int temp = arrays[i];
j = i - 1; //把 j 赋值为 i 的前一个数据
//循环,如果j大于等于0 且 第j个数据大于当前数据
while (j >= 0 && arrays[j] > temp){
arrays[j+1] = arrays[j]; //第j个数据往右移一位
j = j - 1; //往前一位一位移动
}
//把当前数据赋给arrays[j+1],因为在while循环内最后总会j-1
arrays[j+1] = temp;
System.out.println("第"+i+"次:"+Arrays.toString(arrays));
}
System.out.println("最后结果:"+Arrays.toString(arrays));
} public static void main(String[] args) {
int[] arrays={49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
insertSort(arrays);
}
}

测试结果:

第1次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1]
第2次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1]
第3次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1]
第4次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1]
第5次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1]
第6次:[38, 49, 65, 97, 176, 213, 227, 49, 78, 34, 12, 164, 11, 18, 1]
第7次:[38, 49, 49, 65, 97, 176, 213, 227, 78, 34, 12, 164, 11, 18, 1]
第8次:[38, 49, 49, 65, 78, 97, 176, 213, 227, 34, 12, 164, 11, 18, 1]
第9次:[34, 38, 49, 49, 65, 78, 97, 176, 213, 227, 12, 164, 11, 18, 1]
第10次:[12, 34, 38, 49, 49, 65, 78, 97, 176, 213, 227, 164, 11, 18, 1]
第11次:[12, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227, 11, 18, 1]
第12次:[11, 12, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227, 18, 1]
第13次:[11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227, 1]
第14次:[1, 11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227]
最后结果:[1, 11, 12, 18, 34, 38, 49, 49, 65, 78, 97, 164, 176, 213, 227]

时间复杂度:因为外层循环为n-1,所以在最好的情况下,序列本身就是有序的,那么时间复杂度为O(n);最坏的情况下循环次数为n*(n-1)/2,那么时间复杂度为O(n2)。

空间复杂度:插入排序算法,只需要两个变量暂存当前数,以及下标,与n的大小无关,所以空间复杂度为:O(1)。

结语:

  语言表达能力不好,所以只能这样了,还有就是应该还有这个算法的优缺点没有写,明着说,我还不知道。

Java八大排序之插入排序的更多相关文章

  1. Java八大排序算法

    Java八大排序算法: package sort; import java.util.ArrayList; import java.util.Arrays; import java.util.List ...

  2. Java选择排序,插入排序,快速排序

      public class Test { public static void main(String[] args) { int a[] = { 1, 2, 3, 4, 5 }; 选择排序(a); ...

  3. 八大排序算法——插入排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 例如从小到大排序: 1.  从第二位开始遍历, 2.  当前数(第一趟是第二位数)与前面的数依次比较,如果前面的数大于当前数,则将这个数放在当前数的位置上,当前数的下标-1 ...

  4. java八大排序代码

    import java.util.ArrayList;import java.util.List; public class FastSort { public static void main(St ...

  5. 必须知道的Java八大排序算法

    冒泡排序.简单选择.直接插入.快速排序.堆排序.希尔排序.归并排序.基数排序. 将其按排序方式分类如下图所示: 1.冒泡排序: 基本思想——在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上 ...

  6. Java八大排序之希尔(Shell)排序

    希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该 ...

  7. Java八大排序之堆排序

    堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法.堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点. 根据根结点是否是最 ...

  8. Java八大排序之基数排序

    基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分 ...

  9. 八大排序算法原理以及Java实现(直接插入排序)

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

随机推荐

  1. localStorage在不同页面之间的设置值与取值--加密 localStorage与解密localStorage

    在aa.vue页面 <template> <div> <h1>在aa页面设置值</h1> <button @click="shezhi& ...

  2. Linux 中find命令

    1.在当前目录下找以txt结尾的文件 find . -name '*.txt' 2.在当前目录下找以所有字母开头的文件 find . -name '[a-z]*' 3.在/etc 目录下找以host开 ...

  3. input 控件常用属性

  4. vmvare虚拟机篇

    新建虚拟机-典型-稍后安装-Linux-管理-从磁盘删除-虚拟机名称-位置- 安装Tools-用于虚拟机和本地文件共享和传送 网络适配器桥接模式-桥接本地网卡 NAT模式-再重新连接本地网卡 仅主机模 ...

  5. 《高性能MySQL》读后感——聚簇索引

    <高性能MySQL>读后感——聚簇索引 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.比如,InnoDB的聚簇索引使用B+Tree的数据结构存储索引和数据. 当表有聚簇索引时,它 ...

  6. [SpingBoot guides系列翻译]文件上传

    文件上传 这节的任务是做一个文件上传服务. 概况 参考链接 原文 thymeleaf spring-mvc-flash-attributes @ControllerAdvice 你构建的内容 分两部分 ...

  7. 谈谈vue.js中methods watch和compute的区别和联系

    methods,watch和computed都是以函数为基础的,但各自却都不同: 1.watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个数据(称它为依 ...

  8. golang实战--客户信息管理系统

    总计架构图: model/customer.go package model import ( "fmt" ) type Customer struct { Id int Name ...

  9. flexible.js 布局详解

    原文链接:http://caibaojian.com/flexible-js.html 本文讲的通过flexible.js实现了rem自适应,有了flexible.js,我们就不必再为移动端各种设备兼 ...

  10. YY工具隐私政策

    YY工具(以下简称“我们”)深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠.我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则.目的明确原则.选择同意原则.最少够 ...