当前位置: 代码迷 >> 综合 >> 算法面试--插入排序
  详细解决方案

算法面试--插入排序

热度:75   发布时间:2023-12-05 09:49:33.0

资料1:稳定性

资料2:图解排序

概念:设指针A负责遍历整个数组,指针B负责遍历已排序部分(反向遍历,形如尾插法),并比较已排序部分与指针A指向的未排序元素的大小。第一轮,比较第一第二个元素的大小并排序,这时设他们为已排序区,第二轮,指针A指向第三个元素,然后指针B从第二个元素开始逐个跟第三个元素比较,当第三个元素大于第二个元素,证明它就是排序区最大值,则直接进入下一轮,如果第三个元素比第二个元素小,则指针B移动到第一个元素比较然后插入适当的位置,之后第三轮如此类推

代码

public static void sort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {for (int j = i + 1; j > 0; j--) {if (arr[j] < arr[j - 1])swap(arr, j, j - 1); // 大量的交换会消耗时间elsebreak;}}
}// 改进版插入排序(减少了数组元素的操作次数)
public static void better_sort(int[] arr) {for (int i = 0; i < arr.length; i++) {int e = arr[i];int j = i;for (; j > 0; j--) {if (e < arr[j - 1])arr[j] = arr[j - 1];elsebreak;}arr[j] = e;}
}private static void swap(int[] arr, int i, int j) {int t = arr[i];arr[i] = arr[j];arr[j] = t;
}

特点:稳定

时间复杂度:O(n2),最好的情况是不断break;即指针A的值一直的大于指针B的值,不需要轮训已排序区域

空间复杂度:O(1)

关键词:把未排序元素插入已排序区域

  相关解决方案