基础算法学习 | 4.插入排序

80 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

image.png

往期内容

基础算法学习 | 1.二分查找

基础算法学习 | 2.冒泡排序

基础算法学习 | 3.选择排序

前言

插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。

图示(来源网络) image.png

算法实现

算法描述

  • 将数组分为两个区域,排序区域和未排序区域,每一轮从未排序区域中取出第一个元素,插入到排序区域(需保证顺序)
  • 重复以上步骤,直到整个数组有序

算法实现

public static void insert(int[] a) {
    // i 代表待插入元素的索引
    for (int i = 1; i < a.length; i++) {
        // 代表待插入的元素值
        int t = a[i];
        int j = i;
        System.out.println("第" + j + "轮");
        while (j >= 1) {
            // j-1 是上一个元素索引,如果 > t,后移
            if (t < a[j - 1]) {
                a[j] = a[j - 1];
                j--;
            } else {
                // 如果 j-1 已经 <= t, 则 j 就是插入位置
                break;
            }
        }
        a[j] = t;
        System.out.println(Arrays.toString(a) + " 替换索引位置:" + j);
    }
}

测试代码

public static void main(String[] args) {
    int[] array = {1, 35, 40, 3, 49, 60, 8, 47, 48, 11, 20};
    insert(array);
}

运行结果

1轮
[1, 35, 40, 3, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:12轮
[1, 35, 40, 3, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:23轮
[1, 3, 35, 40, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:14轮
[1, 3, 35, 40, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:45轮
[1, 3, 35, 40, 49, 60, 8, 47, 48, 11, 20] 替换索引位置:56轮
[1, 3, 8, 35, 40, 49, 60, 47, 48, 11, 20] 替换索引位置:27轮
[1, 3, 8, 35, 40, 47, 49, 60, 48, 11, 20] 替换索引位置:58轮
[1, 3, 8, 35, 40, 47, 48, 49, 60, 11, 20] 替换索引位置:69轮
[1, 3, 8, 11, 35, 40, 47, 48, 49, 60, 20] 替换索引位置:310轮
[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60] 替换索引位置:4

与选择排序比较

  • 二者平均时间复杂度都是 O(n2)O(n^2)
  • 大部分情况下,插入都略优于选择
  • 有序集合插入的时间复杂度为 O(n)O(n)
  • 插入属于稳定排序算法,而选择属于不稳定排序

大家多多讨论学习salute

image.png