排序算法 - 插入排序

本文详细介绍了插入排序算法的工作原理,通过示例展示了排序过程,并分析了其时间复杂度(O(n)和O(n^2))、空间复杂度(O(1))以及优点(对小规模有序数组的高效)。对比了在大规模数据处理时的局限性,推荐了快速排序和归并排序作为替代方案。
摘要由CSDN通过智能技术生成

插入排序

介绍

插入排序(Insertion Sort)是一种简单直观的排序算法。

它的工作方式类似于我们玩扑克牌时整理手牌的过程。我们开始时左手拿着一张牌,每次从桌上拿起一张新的牌,并与左手中的每张牌从右到左进行比较,直到找到合适的位置插入这张新牌,然后重复这个过程直到桌上所有的牌都被拿完并插入到左手中的正确位置。

插入排序也是这样,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

原理

让我们通过一个简单的例子来理解插入排序的原理。假设我们有一个数组 [3, 5, 4, 1, 6, 2],我们想要将它按照从小到大的顺序排序。

刚开始,我们从数组的第二个元素开始排序,将第一个元素 3 做为已排序部分:

image-20240319162212177

因为 5 > 3 所以 5 的位置不需要改变:

image-20240319163724808

此时,待排序元素为 4,因为 4 > 3 并且 4 < 5,所以 3 之后的有序部分整体后移一个位置,再将 4 填入 3 的后一个位置:

image-20240319164345105

此时,待排序元素为 1,因为 1 < 3,也就是比有序部分中的所有元素都小,所以有序部分中的所有元素都向后移动一个位置,再将 1 填入 3 的前一个位置:

image-20240319165007814

此时,待排序元素为 6,比有序部分中的所有元素都大,因此元素 6 的位置不变:

image-20240319165312106

此时,待排序元素为 2,因为 2 > 12 < 3,所以 1 之后的有序部分整体后移一个位置,再将 2 填入 1 的后一个位置:

image-20240319165610458

至此,排序完成!

排序的动态效果图如下:

alt=“插入排序” style=“zoom: 80%;”
插入排序动态效果图

代码

/**
 * 插入排序的实现
 *
 * @author 孤诣
 */
public class InsertionSort {
    public static void main(String[] args) {
        // 数据准备
        int[] dataArray = {7, 0, 9, 5, 6, 8, 4, 3, 1, 2};
        System.out.println("排序前: " + Arrays.toString(dataArray));

        // 排序
        insertionSort(dataArray);
        System.out.println("排序后: " + Arrays.toString(dataArray));
    }
    
    /**
     * 插入排序算法的实现
     *
     * @param source 源数组
     */
    public static void insertionSort(int[] source) {
        if (source == null) {
            return;
        }

        int length = source.length;

        // 从数组第二个元素开始遍历
        for (int i = 1; i < length; i++) {
            int current = source[i];  // 当前待排序元素
            int j = i - 1;  // 有序部分最大元素的下标

            // 找到合适的插入位置
            while (j >= 0 && source[j] > current) {
                source[j + 1] = source[j];  // 比当前待排序元素大的有序元素后移
                j--;
            }

            // 将当前待排序元素插入到正确位置(此时 j 就是正确位置的下标)
            source[j + 1] = current;
        }
    }
}

评估

时间复杂度:

  • 最好情况:O(n)
  • 最坏情况:O(n^2)
  • 平均时间复杂度:O(n^2)

空间复杂度:O(1)

稳定性:稳定

插入排序的优点是简单、直观,对于小规模或者基本有序的数组排序非常高效,并且适用于对算法稳定性有要求的场景。受限于 O(n^2) 的时间复杂度,其在处理大数据集时会非常耗时,因此实际应用中通常会选择其他的排序算法对数据进行排序,比如:快速排序、归并排序等更高效的排序算法。

快速排序算法不了解的小伙伴可以看看我的这篇文章:http://t.csdnimg.cn/4jWYO

归并排序算法后续我也会专门写一篇文章为大家介绍。

PS: 如果这篇文章对你有帮助的话,还请帮忙点个赞~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值