排序算法-插入排序

一、插入排序法介绍

插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。

二、插入排序法思想

插入排序(Insertion Sorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排 序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。

三、插入排序思路图

排序算法-插入排序 - 图1
可以理解成

四、插入排序法应用实例

有一群小牛, 考试成绩分别是 101, 34, 119, 1 请从小到大排序
1.使用逐步推导的方式来讲解,便利理解

  1. public class InsertSort {
  2. public static void main(String[] args) {
  3. int[] arr = {101, 34, 119, 1};
  4. insertSort(arr); //调用插入排序算法
  5. // System.out.println(Arrays.toString(arr));
  6. }
  7. //插入排序
  8. public static void insertSort(int[] arr) {
  9. //使用逐步推导的方式来讲解,便利理解
  10. //第 1 轮 {101, 34, 119, 1}; => {34, 101, 119, 1}
  11. //{101, 34, 119, 1}; => {101,101,119,1}
  12. //定义待插入的数
  13. int insertVal = arr[1];
  14. int insertIndex = 1 - 1; //即 arr[1]的前面这个数的下标
  15. //给 insertVal 找到插入的位置
  16. //说明
  17. //1. insertIndex >= 0 保证在给 insertVal 找插入位置,不越界
  18. //2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
  19. //3. 就需要将 arr[insertIndex] 后移
  20. while(insertIndex >= 0 && insertVal < arr[insertIndex] ) {
  21. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  22. insertIndex--;
  23. }
  24. //当退出 while 循环时,说明插入的位置找到, insertIndex + 1
  25. //理解不了,可以 debug
  26. arr[insertIndex + 1] = insertVal;
  27. System.out.println("第 1 轮插入");
  28. System.out.println(Arrays.toString(arr));
  29. //第 2 轮
  30. insertVal = arr[2];
  31. insertIndex = 2 - 1;
  32. while(insertIndex >= 0 && insertVal < arr[insertIndex] ) {
  33. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  34. insertIndex--;
  35. }
  36. arr[insertIndex + 1] = insertVal;
  37. System.out.println("第 2 轮插入");
  38. System.out.println(Arrays.toString(arr));
  39. //第 3 轮
  40. insertVal = arr[3];
  41. insertIndex = 3 - 1;
  42. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
  43. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  44. insertIndex--;
  45. }
  46. arr[insertIndex + 1] = insertVal;
  47. System.out.println("第 3 轮插入");
  48. System.out.println(Arrays.toString(arr));
  49. }
  50. }

2.使用 for 循环来把代码简化

  1. public class InsertSort {
  2. public static void main(String[] args) {
  3. int[] arr = {101, 34, 119, 1, -1, 89};
  4. insertSort(arr); //调用插入排序算法
  5. //System.out.println(Arrays.toString(arr));
  6. }
  7. //插入排序
  8. public static void insertSort(int[] arr) {
  9. int insertVal = 0;
  10. int insertIndex = 0;
  11. //使用 for 循环来把代码简化
  12. for(int i = 1; i < arr.length; i++) {
  13. //定义待插入的数
  14. insertVal = arr[i];
  15. insertIndex = i - 1; // 即 arr[1]的前面这个数的下标
  16. // 给 insertVal 找到插入的位置
  17. // 说明
  18. // 1. insertIndex >= 0 保证在给 insertVal 找插入位置,不越界
  19. // 2. insertVal < arr[insertIndex] 待插入的数,还没有找到插入位置
  20. // 3. 就需要将 arr[insertIndex] 后移
  21. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
  22. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  23. insertIndex--;
  24. }
  25. // 当退出 while 循环时,说明插入的位置找到, insertIndex + 1
  26. // 举例:理解不了,我们一会 debug
  27. //这里我们判断是否需要赋值
  28. if(insertIndex + 1 != i) {
  29. arr[insertIndex + 1] = insertVal;
  30. }
  31. System.out.println("第"+i+"轮插入");
  32. System.out.println(Arrays.toString(arr));
  33. }
  34. }
  35. }