Java常用算法 - 插入排序

133 阅读1分钟

插入排序

插入排序整个过程类似于整理扑克牌策略:在抽取1张牌后,与手中已有牌进行比较,并将其插入到正确的位置,从而保持手中牌有序。

原理

基本思想:每次将1个待排序的元素与已排好序的元素逐一进行比较,直到找到合适的位置将其插入。

图解分析

假设当前存在数组{67,2,23,12,34},默认第1个元素67处于正确位置,那第1个待排序元素为2,将其取出,与前1个元素67进行比较,由于67>2,此时我们将67向右移动,此时已没有小于2的元素,故将元素2插入空白位置。接下依次取出待排序元素,重复上述动作,即可完成数组的排序。

InsertSort1.jpg

代码实现

public static void insertSort(int[] arr) {
    int temp;
    int j;
    // 假设第1个元素已经被放在正确的位置
    for (int i = 1; i < arr.length; i++) {
        temp = arr[i];
        j = i;
        while (j > 0 && temp < arr[j - 1]) {
            // 数值较大的元素向右移动
            arr[j] = arr[j - 1];
            j--;
        }
        arr[j] = temp;
    }
}

时间复杂度

最好情况

数组为升序排列,此时无需移动元素,仅需要进行n-1次的元素比较,故时间复杂度为:O(n)。

最坏情况

数组为降序排列,此时需要元素比较次数以及移动元素次数均为n(n-1)/2,故平均时间复杂度为:O(n^2)。

参考文献

插入排序详解