从零开始学习算法之直接插入排序(JAVA版)

这篇博客介绍了直接插入排序的原理,通过逐步比较和移动元素将一个无序序列逐步变为有序。文章提供了两种代码实现,包括原始版本和优化后的版本,优化版减少了不必要的值交换操作。直接插入排序适合小规模或部分有序的数据集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从零开始学习算法之直接插入排序

算法原理

直接插入排序:首先说明下,直接插排意思是在有序数组中插入一条记录。
因此理解此数组只由三个部分组成,无需数组,已排序数组,本次插入的记录。
下面详细讲解步骤

看图

在这里插入图片描述

步骤说明

1.首先我们默认第一个元素是有序的,将他作为有序数组,后一位元素作为比较的记录取出
2.比较后一位元素(以图为例为1)和此时有序数组中的最后一位比较(即最大值)。
3.比较分为两种情况,小于,不小于最大值。当小于最大值时,最大元素需要后移一格腾出空间,此记录插入。同时再比较有序数组重复。直至此记录不大于有序数组某一位数据,然后将记录插入至此

代码初版

    public static void main(String[] args) {
        int[] num = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        //直接插入
        insertionSort(num);

    }


    /**
     * 插入排序,内层是有序的数组,外层是无序的数组,每次从外层取到值,在内层与有序数组比较大小,
     * 进行横移插入操作
     */
    public static void insertionSort(int[] num){
        int j;
        for (int i = 1; i < num.length; i++) {
            for(j = i; j>0 ;j--) {
                if (num[j]<num[j-1]){
                    int temp = num[j-1];
                    num[j-1] = num[j];
                    num[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(num));
    }

改进,其实从代码可以发现,每次更新都需要进行值交互,但我们在外层循环时,实际上是内层腾出一个位置,外层再将值放入,因此,内层可简化,循环后在对应位置留下空位,之后的数据后移
外层循环内将值直接插入至空位置

 public static void main(String[] args) {
        int[] num = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
        //直接插入
        insertionSort(num);
    }

    /**
     * 插入排序,内层是有序的数组,外层是无序的数组,每次从外层取到值,在内层与有序数组比较大小,
     * 进行横移插入操作
     * @param num
     */
    public static void insertionSort(int[] num){
        int j;
        for (int i = 1; i < num.length; i++) {
            int temp = num[i];
            for(j = i; j>0&&num[j]<num[j-1] ;j--) {
            num[j] =num [j-1];
            }
            num[j] = temp;
        }
        System.out.println(Arrays.toString(num));
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值