金九银十之插入排序

75 阅读1分钟

什么是插入排序

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

时间,空间

时间:O(N^2)

空间:O(1)

代码实现

public static void insertSort(int[] arr) {
  //如果为空或者小于2,则不需要排序 直接就是有序的
  if (arr == null || arr.length < 2) {
    return;
  }
  for (int i = 1; i < arr.length; i++) {
    //用i位置的数跟i位置前面的数依次比较,到0停,如果小,交换,否则继续
    for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
      swap(arr, j, j + 1);
    }
  }
}
public static void swap(int[] arr, int i, int j) {
  int tmp = arr[i];
  arr[i] = arr[j];
  arr[j] = tmp;
}

执行过程

插入排序.2021-09-24 15_48_34.gif

是否稳定

稳定

  • 1、已经有序的小序列的基础上,一次插入一个元素;
  • 2、想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置;
  • 3、如果碰见一个和插入元素相 等的,那么插入元素把想插入的元素放在相等元素的后面;
  • 4、相等元素的前后顺序没有改变;