1、简单介绍

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

2、源码

  1. package com.study.sort;
  2. import java.util.Arrays;
  3. public class InsertSort {
  4. public static void main(String[] args) {
  5. int[] arr = {50,40,101,34,99,1};
  6. insertSort(arr);
  7. }
  8. public static void insertSort(int[] arr){
  9. for (int i = 0; i < arr.length; i++) {
  10. int insertVal = arr[i];//定义有序表的最后一个元素
  11. int insertIndex = i-1;//定义有序表最后一个元素的下标
  12. //最后一个元素依次往前比较
  13. while (insertIndex >= 0 && insertVal < arr[insertIndex]){
  14. //将比它大的元素往后移
  15. arr[insertIndex+1] = arr[insertIndex];
  16. //下标递减
  17. insertIndex -= 1;
  18. }
  19. //退出循环,找到了位置,在后一个位置插入
  20. arr[insertIndex+1] = insertVal;
  21. System.out.println("第"+(i+1)+"轮插入:"+ Arrays.toString(arr));
  22. }
  23. }
  24. }

3、运行结果

图片.png

4、测试插入排序

测试排序对80000个随机数进行排序,仅仅不到1s
图片.png
测试源码

  1. package com.study.sort;
  2. import java.util.Arrays;
  3. import java.util.Random;
  4. public class InsertSort {
  5. public static void main(String[] args) {
  6. /*int[] arr = {50,40,101,34,99,1};
  7. insertSort(arr);*/
  8. int[] arr = new int[80000];
  9. Random random = new Random();
  10. for (int i = 0; i < 80000; i++) {
  11. arr[i] = random.nextInt(800000000);
  12. }
  13. long l1 = System.currentTimeMillis();
  14. insertSort(arr);
  15. long l2 = System.currentTimeMillis();
  16. System.out.println("插入排序对"+arr.length+"个数据排序所花费的时间为:"+(l2-l1)+"ms");
  17. }
  18. public static void insertSort(int[] arr){
  19. for (int i = 0; i < arr.length; i++) {
  20. int insertVal = arr[i];//定义有序表的最后一个元素
  21. int insertIndex = i-1;//定义有序表最后一个元素的下标
  22. //最后一个元素依次往前比较
  23. while (insertIndex >= 0 && insertVal < arr[insertIndex]){
  24. //将比它大的元素往后移
  25. arr[insertIndex+1] = arr[insertIndex];
  26. //下标递减
  27. insertIndex -= 1;
  28. }
  29. //退出循环,找到了位置,在后一个位置插入
  30. arr[insertIndex+1] = insertVal;
  31. //System.out.println("第"+(i+1)+"轮插入:"+ Arrays.toString(arr));
  32. }
  33. }
  34. }