插入排序属于内部排序法,是对要排序的元素已插入的方式找寻这个元素的适当位置,以达到排序的目的.

算法描述

把N个待排序的元素看成为一个有序表和一个无序表,开始有序表中只有一个元素,也就是要排序的数组的第一个元素,无序表中有N-1个元素,排序的过程中每次从无序表里面取出第一个元素,把这个元素和有序表每个元素做比较,来插入到合适的位置(比如说元素是4 ,从有序表里面找到3这个元素,发现比3大,接着找,找到了6,发现比6小,那么这个元素4就插入到3和6之间)

动图演示

3.插入排序(Insertion Sort) - 图1

算法分析

最佳情况:T(n) = O(n) 最坏情况:T(n) = O(n2) 平均情况:T(n) = O(n2)

代码实现

1.最初不用for循环的时候

  1. public static void main(String[] args) {
  2. int[] arr = {5, 3, 4, 2, 1};
  3. //使用逐步推导的方式来讲解,便利理解
  4. doInsertSort(arr, 1);
  5. doInsertSort(arr, 2);
  6. doInsertSort(arr, 3);
  7. doInsertSort(arr, 4);
  8. }
  9. /**
  10. * num 排序的次数
  11. */
  12. private static void doInsertSort(int[] arr, int num) {
  13. //定义待插入的数
  14. int insertVal = arr[num];
  15. int insertIndex = num - 1; //即arr[1]的前面这个数的下标
  16. //给insertVal 找到插入的位置
  17. // 如果要插入的元素比当前元素小,就接着往前查找
  18. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
  19. // 比要插入的元素大,就交换一下位置, 比如说 5比3大,就交换位置为 3 ,5
  20. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  21. insertIndex--;
  22. }
  23. //当退出while循环时,说明插入的位置找到, insertIndex + 1
  24. arr[insertIndex + 1] = insertVal;
  25. System.out.println("第" + num + "轮插入");
  26. System.out.println(Arrays.toString(arr));
  27. }

结果:

  1. 1轮插入
  2. [3, 5, 4, 2, 1]
  3. 2轮插入
  4. [3, 4, 5, 2, 1]
  5. 3轮插入
  6. [2, 3, 4, 5, 1]
  7. 4轮插入
  8. [1, 2, 3, 4, 5]

2.使用for循环简化步骤一

  1. public static void main(String[] args) {
  2. int[] arr = {5, 3, 4, 2, 1};
  3. for (int i = 1; i < arr.length ; i++) {
  4. doInsertSort(arr, i);
  5. }
  6. }
  7. /**
  8. * num 排序的次数
  9. */
  10. private static void doInsertSort(int[] arr, int num) {
  11. //定义待插入的数
  12. int insertVal = arr[num];
  13. int insertIndex = num - 1; //即arr[1]的前面这个数的下标
  14. // 如果要插入的元素比当前元素小,就接着往前查找
  15. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
  16. // 比要插入的元素大,就交换一下位置, 比如说 5比3大,就交换位置为 3 ,5
  17. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  18. insertIndex--;
  19. }
  20. //当退出while循环时,说明插入的位置找到, insertIndex + 1
  21. arr[insertIndex + 1] = insertVal;
  22. System.out.println("第" + num + "轮插入");
  23. System.out.println(Arrays.toString(arr));
  24. }

输出结果和上面的一样,就不罗列出来了

3.最终版本

  1. public static void main(String[] args) {
  2. int[] arr = {5, 3, 4, 2, 1};
  3. for (int i = 1; i < arr.length ; i++) {
  4. int insertVal = arr[i];
  5. int insertIndex = i - 1; //即arr[1]的前面这个数的下标
  6. // 如果要插入的元素比当前元素小,就接着往前查找
  7. while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
  8. // 比要插入的元素大,就交换一下位置, 比如说 5比3大,就交换位置为 3 ,5
  9. arr[insertIndex + 1] = arr[insertIndex];// arr[insertIndex]
  10. insertIndex--;
  11. }
  12. arr[insertIndex + 1] = insertVal;
  13. System.out.println("第" + i + "轮插入");
  14. System.out.println(Arrays.toString(arr));
  15. }
  16. }

输出结果和上面的一样,就不罗列出来了