算法面试--插入排序

资料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); // 大量的交换会消耗时间
            else
                break;
        }
    }
}

// 改进版插入排序(减少了数组元素的操作次数)
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];
            else
                break;
        }
        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)

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

猜你喜欢

转载自blog.csdn.net/qq_38056704/article/details/82853562