插入排序

简介
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。
基本思想
把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。
时间复杂度
平均时间复杂度和最坏时间复杂度都是O(n²)
代码

public static void test () {
    int[] arr = {5,1,10,7,-2};
    //第一轮,无序表中已经有数据5
    int value = arr[1];
    int index = 0;
    while (index >= 0 && value < arr[index]) {
      arr[index + 1] = arr[index];
      index--;
    }
    //value的值比下标为index的数大,就放在它的后面
    arr[index + 1] = value;
    System.out.println("第一次排序=======");
    System.out.println(Arrays.toString(arr));

    //第二轮,无序表中已经有数据1,5
    value = arr[2];
    index = 1;
    while (index >= 0 && value < arr[index]) {
      arr[index + 1] = arr[index];
      index--;
    }
    //value的值比下标为index的数大,就放在它的后面
    arr[index + 1] = value;
    System.out.println("第二次排序=======");
    System.out.println(Arrays.toString(arr));

    //第三轮,无序表中已经有数据1,5,10
    value = arr[3];
    index = 2;
    while (index >= 0 && value < arr[index]) {
      arr[index + 1] = arr[index];
      index--;
    }
    //value的值比下标为index的数大,就放在它的后面
    arr[index + 1] = value;
    System.out.println("第三次排序=======");
    System.out.println(Arrays.toString(arr));

    //第四轮,无序表中已经有数据1,5
    value = arr[4];
    index = 3;
    while (index >= 0 && value < arr[index]) {
      arr[index + 1] = arr[index];
      index--;
    }
    //value的值比下标为index的数大,就放在它的后面
    arr[index + 1] = value;
    System.out.println("第四次排序=======");
    System.out.println(Arrays.toString(arr));
  }


以上代码可以简写为:

 public static void insertSort (int[] arr) {
    int value;
    int index;
    for (int i = 1; i < arr.length; i++) {
      value = arr[i];
      index = i - 1;
      while (index >= 0 && value < arr[index]) {
        arr[index + 1] = arr[index];
        index--;
      }
      if (index + 1 != i) {
        arr[index + 1] = value;
      }
    }
  }

posted @ 2021-08-07 21:10  翻蹄亮掌一皮鞋  阅读(29)  评论(0)    收藏  举报