插入排序的基本介绍:

插入排序是对想要排序的序列以插入的方式寻找该元素的适当的位置,从而达到排序的目的。

插入排序的基本思想:

把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));
}
}

上述代码的最终结果如下:

最新文章

  1. Vue.js&mdash;&mdash;60分钟快速入门
  2. C#得到某月最后一天晚上23:59:59和某月第一天00:00:00
  3. Android 中算法问题
  4. 黑科技项目:英雄无敌III Mod &lt;&lt;Fallen Angel&gt;&gt;介绍
  5. node基础05:路由基础
  6. Ubuntu——&quot;xxx is not in the sudoers file.This incident will be reported&quot; 错误解决方法
  7. 在Web上调用Ocx控件
  8. 讲解最好的Python正则表达式
  9. C Looooops(扩展欧几里得求模线性方程)
  10. (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
  11. C#学习之------委托
  12. React之组件通信
  13. Python网络爬虫与信息提取(一)
  14. Hibernate框架进阶(下篇)之查询
  15. [Note] Yet Another Resource Negotiator
  16. java.lang.ClassNotFoundException: org.I0Itec.zkclient.IZkStateListener异常解决
  17. python修炼第三天
  18. KMeams算法应用:图片压缩与贝叶斯公式理解
  19. 案例:8,64,256都是2的阶次方数(8是2的3次方),用Java编写程序来判断一个整数是不是2的阶次方数。
  20. 【转】编程思想之多线程与多进程(3)——Java中的多线程

热门文章

  1. Windown Server 2008配置tomcat9虚拟路径
  2. MARKDOWN使用文档
  3. P4962 朋也与光玉题解
  4. springBoot2.0使用@slf4j注解记录日志
  5. js汉字转换为拼音
  6. 在 Chrome DevTools 中调试 JavaScript 入门
  7. php打开csv
  8. SpringBoot+SpringCloud 笔记
  9. C++循环单链表删除连续相邻重复值
  10. Linux日常操作整理