Java数据结构之排序---插入排序
插入排序的基本介绍:
插入排序是对想要排序的序列以插入的方式寻找该元素的适当的位置,从而达到排序的目的。
插入排序的基本思想:
把n个待排序的元素看成一个有序表和一个无序表,开始时,有序表只有一个元素(整个序列的第一个元素看成有序表的第一个元素),无序表中有n-1个元素,在接下来的排序过程中,每次从无序表中取出一个元素,将它依次与有序表中的元素进行比较(注意:与有序表中元素比较的顺序是从后向前),将它插入到有序表中的适当的位置,使其成为新的有序表。
插入排序的基本思路图:

接下来,我会通过代码讲述插入算法的实现过程,也会通过两种方式进行讲解:分步骤的实现,整体的实现。具体的解释,我将在代码的注释中进行标注。
(1).分步骤的实现
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
insertSort(arr);
}
//直接插入排序
public static void insertSort(int[] arr){
//第一趟排序
//因为我们第一个元素是有序表中的元素,因此我们在从无序表中取第一个元素的时候(索引为1),应该让其与它前一个元素进行比较。
//所以我们要比较元素的索引值应该是1-1=0
//之后我们将带排序的元素赋值给insertVal(因为是第一躺,所以是arr[1])
int insertIndex = 1-1;
int insertVal = arr[1];
//这里面我们通过insertIndex>=0来限制数组越界
//并且当我们插入的元素小于它之前的元素时,执行该循环
while(insertIndex>=0 && insertVal<arr[insertIndex]){
//将有序列表中的元素后移
arr[insertIndex+1] = arr[insertIndex];
//当进行比较的时候,说明现在insertIndex位置的元素已经比我们待插入的元素大了,这个时候我们应该将insertIndex向前移动一位继续比较,
//一直到insertIndex<0(待插入元素最小)或者找到一个比待插入元素小的数为止
insertIndex--;
}
//这里注意的是insertIndex+1,因为经过上述insertIndex--,我们最终得到的insertIndex比我们待插入的值少1,因此下面我们要加1,之后把insertVal插入进去。
arr[insertIndex+1] = insertVal;
System.out.println("第一趟排序的结果:");
System.out.println(Arrays.toString(arr));
//第二趟排序
insertIndex = 2-1;
insertVal = arr[2];
while(insertIndex>=0 && insertVal<arr[insertIndex]){
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1] = insertVal;
System.out.println("第二趟排序的结果:");
System.out.println(Arrays.toString(arr));
//第三趟排序
insertIndex = 3-1;
insertVal = arr[3];
while(insertIndex>=0 && insertVal<arr[insertIndex]){
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1] = insertVal;
System.out.println("第三趟排序的结果:");
System.out.println(Arrays.toString(arr));
}
上述代码最终的结果如下所示:

(2).整体的代码实现
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {101,34,119,1};
insertSort(arr);
}
//直接插入排序
public static void insertSort(int[] arr){
//直接插入排序
//通过上面的步骤,我们知道执行插入排序我们只需要每次改变i的值即可。
//因此整体的代码如下
for(int i=1;i<arr.length;i++){ //这里面的i需要小于arr.length,因为我们也要与无序序列中的最后一个元素进行比较。
int insertVal = arr[i];
int insertIndex = i-1;
while(insertIndex>=0 && insertVal<arr[insertIndex]){
arr[insertIndex+1] = arr[insertIndex];
insertIndex--;
}
arr[insertIndex+1] = insertVal;
System.out.println("第"+i+"趟的排序:");
System.out.println(Arrays.toString(arr));
}
}
上述代码的最终结果如下:

Java数据结构之排序---插入排序的更多相关文章
- Java数据结构与排序
一.引子:想要给ArrayList排序却发现没有排序方法?你有两种选择: 1.换用TreeSet: 2.使用Collection.sort(List<T> list) ...
- 过三关 Java冒泡排序选择排序插入排序小练习
材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...
- java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数
import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...
- JAVA数据结构--希尔排序
希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需 ...
- Java数据结构之排序
1.冒泡排序:时间复杂度为O(n2) 假设是由小到大排序:相邻两个数之间进行比较,较大的数在后面.一次比较过后最大的数排在最后面 如:40.8.15.18.12一次排序后为:8.15.18.12.40 ...
- JAVA数据结构--选择排序
选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...
- Java数据结构(排序篇)
冒泡排序:是经过n-1趟子排序完毕的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数.大泡在上,小泡在下. 选择排序:每一趟从待排序的数据元素中选出最小(或 ...
- Java数据结构之排序---希尔排序
希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...
- Java数据结构之排序---选择排序
简单选择排序的介绍: 从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的. 简单选择排序的基本思想: 假定我们的数组为int [] arr = new int[n],第一 ...
随机推荐
- 【五一qbxt】test2
又犯了一些迷之错误??要不然yy鼠标就是我的了 1.Superman: 小姐姐的题解:直接用set模拟即可emmmm 里面有很多指针啊,乱七八糟的,不会qwq,先看看我的大模拟吧: #include& ...
- 洛谷 P1417 烹调方案 题解
题面 这道题是一道典型的排序dp a[i]−b[i]∗(t+c[i])+a[j]−b[j]∗(t+c[i]+c[j]) a[j]−b[j]∗(t+c[j])+a[i]−b[i]∗(t+c[i]+c[j ...
- 细说Python的lambda函数用法,建议收藏
细说Python的lambda函数用法,建议收藏 在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数.今天我就和大家聊聊lambda函数,在Pyth ...
- 在 Chrome DevTools 中调试 JavaScript 入门
第 1 步:重现错误 找到一系列可一致重现错误的操作始终是调试的第一步. 点击 Open Demo. 演示页面随即在新标签中打开. OPEN DEMO 在 Number 1 文本框中输入 5. 在 N ...
- mysql导入导出数据,备份,恢复数据
MYSQL 实现导入数据 .备份和恢复数据库 1.使用msql命令导入数据 # mysql -uroot -p 需要选择一个数据库 < runoob.sql #mysql -u username ...
- 自动化运维——HelloWorld(一)
1.HelloWorld vi first_shell.sh #!/bin/bash #Filename: first_shell.sh #auto echo hello world! #by aut ...
- Linux中配置jdk环境变量出错:bad ELF interpreter: No such file or directory解决方法
yum install glibc.i686 重新安装,javac成功 如果还有如下类系错误 再继续安装包 error while loading shared libraries: libstdc+ ...
- Ubuntu 安装uwsgi出错
1.分析了下,感觉是gcc除了问题,百度了一下,发现有类似的解决办法,记录一下. Collecting uwsgi Using cached https://files.pythonhosted.or ...
- kloxo增加了域名,怎么不能访问?如何重启web服务?
kloxo增加了域名,怎么不能访问?这是因为需要重新启动web服务. 有时候网站打不开,也可以尝试重启web服务. 重启web服务方法: 登录kloxo后台-->左边栏:服务器linux --& ...
- Rsync实现负载均衡的数据同步
使用三台服务器:系统:CentOS 6.8 192.168.8.169 开发服务器 192.168.8.167 线上服务器1192.168.8.168 线上服务器2 实现思路:在开发服务器上制定一个规 ...