数据结构与算法(第二季):插入排序

2022-01-11  本文已影响0人  萧1帅

插入排序(Insertion Sort)

一、概念

image image

二、代码实现

image

三、逆序对(Inversion)

image

四、代码优化

1、 第一种优化

image image

2、 第二种优化(二分搜索优化)

image image

2.1、 思路

image

2.2、 实例

image

2.3 实现

@Override
protected void sort() {
    for (int begin = 1; begin < array.length; begin++) {
        insert(begin, search(begin));
    }
}

/**
 * 将source位置的元素插入到dest位置
 * @param source
 * @param dest
 */
private void insert(int source, int dest) {
    T v = array[source];
    for (int i = source; i > dest; i--) {
        array[i] = array[i - 1];
    }
    array[dest] = v;
}

/**
 * 利用二分搜索找到 index 位置元素的待插入位置
 * 已经排好序数组的区间范围是 [0, index)
 * @param index
 * @return
 */
private int search(int index) {
    int begin = 0;
    int end = index;
    while (begin < end) {
        int mid = (begin + end) >> 1;
        if (cmp(array[index], array[mid]) < 0) {
            end = mid;
        } else {
            begin = mid + 1;
        }
    }
    return begin;
}
复制代码

二分搜索(Binary Search)

一、 概念

image image

二、 思路

image

三、 实例

image image

四、代码实现

/**
 * 查找v在有序数组array中的位置
 */
public static int indexOf(int[] array, int v) {
    if (array == null || array.length == 0) return -1;
    int begin = 0;
    int end = array.length;
    while (begin < end) {
        int mid = (begin + end) >> 1;
        if (v < array[mid]) {
            end = mid;
        } else if (v > array[mid]) {
            begin = mid + 1;
        } else {
            return mid;
        }
    }
    return -1;
}
复制代码
上一篇 下一篇

猜你喜欢

热点阅读