插入排序的基本介绍:

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

插入排序的基本思想:

把n个待排序的元素看成一个有序表和一个无序表,开始时,有序表只有一个元素(整个序列的第一个元素看成有序表的第一个元素),无序表中有n-1个元素,在接下来的排序过程中,每次从无序表中取出一个元素,将它依次与有序表中的元素进行比较(注意:与有序表中元素比较的顺序是从后向前),将它插入到有序表中的适当的位置,使其成为新的有序表。

插入排序的基本思路图:

接下来,我会通过代码讲述插入算法的实现过程,也会通过两种方式进行讲解:分步骤的实现,整体的实现。具体的解释,我将在代码的注释中进行标注。

(1).分步骤的实现

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. int[] arr = {101,34,119,1};
  4. insertSort(arr);
  5.  
  6. }
  7. //直接插入排序
  8. public static void insertSort(int[] arr){
  9. //第一趟排序
  10. //因为我们第一个元素是有序表中的元素,因此我们在从无序表中取第一个元素的时候(索引为1),应该让其与它前一个元素进行比较。
  11. //所以我们要比较元素的索引值应该是1-1=0
  12. //之后我们将带排序的元素赋值给insertVal(因为是第一躺,所以是arr[1])
  13. int insertIndex = 1-1;
  14. int insertVal = arr[1];
  15. //这里面我们通过insertIndex>=0来限制数组越界
  16. //并且当我们插入的元素小于它之前的元素时,执行该循环
  17. while(insertIndex>=0 && insertVal<arr[insertIndex]){
  18. //将有序列表中的元素后移
  19. arr[insertIndex+1] = arr[insertIndex];
  20. //当进行比较的时候,说明现在insertIndex位置的元素已经比我们待插入的元素大了,这个时候我们应该将insertIndex向前移动一位继续比较,
  21. //一直到insertIndex<0(待插入元素最小)或者找到一个比待插入元素小的数为止
  22. insertIndex--;
  23. }
  24. //这里注意的是insertIndex+1,因为经过上述insertIndex--,我们最终得到的insertIndex比我们待插入的值少1,因此下面我们要加1,之后把insertVal插入进去。
  25. arr[insertIndex+1] = insertVal;
  26. System.out.println("第一趟排序的结果:");
  27. System.out.println(Arrays.toString(arr));
  28.  
  29. //第二趟排序
  30. insertIndex = 2-1;
  31. insertVal = arr[2];
  32. while(insertIndex>=0 && insertVal<arr[insertIndex]){
  33. arr[insertIndex+1] = arr[insertIndex];
  34. insertIndex--;
  35. }
  36.  
  37. arr[insertIndex+1] = insertVal;
  38. System.out.println("第二趟排序的结果:");
  39. System.out.println(Arrays.toString(arr));
  40.  
  41. //第三趟排序
  42. insertIndex = 3-1;
  43. insertVal = arr[3];
  44. while(insertIndex>=0 && insertVal<arr[insertIndex]){
  45. arr[insertIndex+1] = arr[insertIndex];
  46. insertIndex--;
  47. }
  48.  
  49. arr[insertIndex+1] = insertVal;
  50. System.out.println("第三趟排序的结果:");
  51. System.out.println(Arrays.toString(arr));
  52. }

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

(2).整体的代码实现

  1. public static void main(String[] args) {
  2. // TODO Auto-generated method stub
  3. int[] arr = {101,34,119,1};
  4. insertSort(arr);
  5.  
  6. }
  7. //直接插入排序
  8. public static void insertSort(int[] arr){
  9. //直接插入排序
  10.  
  11. //通过上面的步骤,我们知道执行插入排序我们只需要每次改变i的值即可。
  12. //因此整体的代码如下
  13. for(int i=1;i<arr.length;i++){ //这里面的i需要小于arr.length,因为我们也要与无序序列中的最后一个元素进行比较。
  14. int insertVal = arr[i];
  15. int insertIndex = i-1;
  16. while(insertIndex>=0 && insertVal<arr[insertIndex]){
  17. arr[insertIndex+1] = arr[insertIndex];
  18. insertIndex--;
  19. }
  20. arr[insertIndex+1] = insertVal;
  21. System.out.println("第"+i+"趟的排序:");
  22. System.out.println(Arrays.toString(arr));
  23. }
  24. }

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

Java数据结构之排序---插入排序的更多相关文章

  1. Java数据结构与排序

    一.引子:想要给ArrayList排序却发现没有排序方法?你有两种选择:        1.换用TreeSet:     2.使用Collection.sort(List<T> list) ...

  2. 过三关 Java冒泡排序选择排序插入排序小练习

    材料:猴子排序,按照身高来从小到大来排序. 第一关: 老猴子带领小猴子队伍按大小逐一比较,交换,开始高矮排列队伍.(冒泡排序) 第二关: 太慢了,给第一关增加难度,进行选择排序 第三关: 最后,尝试选 ...

  3. java冒泡排序-选择排序-插入排序-使用API中文文档直接调用函数

    import java.util.Arrays; public class ArrayDemo2_3 { public static void main(String []args) { //---- ...

  4. JAVA数据结构--希尔排序

    希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需 ...

  5. Java数据结构之排序

    1.冒泡排序:时间复杂度为O(n2) 假设是由小到大排序:相邻两个数之间进行比较,较大的数在后面.一次比较过后最大的数排在最后面 如:40.8.15.18.12一次排序后为:8.15.18.12.40 ...

  6. JAVA数据结构--选择排序

    选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理如下.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然 ...

  7. Java数据结构(排序篇)

    冒泡排序:是经过n-1趟子排序完毕的,第i趟子排序从第1个数至第n-i个数,若第i个数比后一个数大(则升序,小则降序)则交换两数.大泡在上,小泡在下. 选择排序:每一趟从待排序的数据元素中选出最小(或 ...

  8. Java数据结构之排序---希尔排序

    希尔排序的基本介绍: 希尔排序同之前的插入排序一样,它也是一种插入排序,只不过它是简单插入排序之后的一个优化的排序算法,希尔排序也被称为缩小增量排序. 希尔排序的基本思想: 希尔排序是把数组中给定的元 ...

  9. Java数据结构之排序---选择排序

    简单选择排序的介绍: 从给定的序列中,按照指定的规则选出某一个元素,再根据规定交换位置后达到有序的目的. 简单选择排序的基本思想: 假定我们的数组为int [] arr = new int[n],第一 ...

随机推荐

  1. Spring(四)--bean的属性赋值

    bean的属性赋值 1.需要的实体类 2.需要的配置文件 <?xml version="1.0" encoding="UTF-8"?> <be ...

  2. 极*Java速成教程 - (1)

    序言 众所周知,程序员需要快速学习新知识,所以就有了<21天精通C++>和<MySQL-从删库到跑路>这样的书籍,Java作为更"高级"的语言也不应该落后, ...

  3. <<C++ Primer>> 第四章 表达式

    术语表 第 4 章 表达式 算术转换(arithmetic conversion): 从一种算术类型转换成另一种算术类型.在二元运算符的上下文中,为了保留精度,算术转换通常把较小的类型转换成较大的类型 ...

  4. empty() 为true

    //empty() 为truevar_dump(empty(0));var_dump(empty('0'));var_dump(empty(array()));var_dump(empty(null) ...

  5. python之代码规范

    第一章 为什么要有规范化目录 真正的后端开发的项目,系统等,少则几万行代码,多则十几万,几十万行代码 软件开发,规范你的项目目录结构,代码规范,遵循PEP8规范等等,让你更加清晰,合理开发. 1.代码 ...

  6. Flask-wtf导入Regexp规则库验证手机号码合法性(测试通过)

    手机号码在项目有着很重要的地位,保证用户输入的号码准确无误就显得很关键. 废话不多说,现在页面中引入Regexp规则库: from wtforms.validators import Regexp 验 ...

  7. 云服务器linux重新挂载指定目录(非扩充)

    新买的香港云服务器,系统只能在商家的控制台上安装. 系统和硬盘分开的,根目录空间只有10G.需要重新设置相关目录的大小,如:/usr./var./home等. 以下是自己的解决方法小计. 一.初始的分 ...

  8. solve update pip 10.0.0

    The bug is found in pip 10.0.0. In linux you need to modify file: /usr/bin/pip from: from pip import ...

  9. MySQL数据库入门备份数据库

    MySQL数据库入门——备份数据库   一提到数据,大家神经都会很紧张,数据的类型有很多种,但是总归一点,数据很重要,非常重要,因此,日常的数据备份工作就成了运维工作的重点中的重点的重点....... ...

  10. mysql 函数GROUP_CONCAT(temp.amount SEPARATOR ',')的用法

    mysql 函数GROUP_CONCAT(temp.amount SEPARATOR ',')的用法 使用场景:例如:想要查询用户的最喜欢购买的几种商品,这个时候就需要使用group_concat(字 ...