最简洁明了易懂,数据结构:插入排序之直接插入排序

本文详细介绍了直接插入排序的基本思想和工作原理,通过一个具体的例子展示了排序过程。代码实现部分给出了Java语言的直接插入排序算法,展示了如何将一个无序数组逐步转化为有序。在排序过程中,算法会将每个元素与其前面已排序的元素进行比较,找到合适的位置插入,最终得到升序排列的数组。

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

直接插入排序:

直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

 仅使用了常数个辅助单元,因而空间复杂度为O(1)

时间复杂度:O(n)

49 38 65 97 76 13 27 79

直接插入排序就是依次排序 :

第一次排序 38与49 比较交换 变成 38 49 65 97 76 13 27 79

第二次是65与前面的38 49 比较 不交换38 49 65 97 76 13 27 79

第二次是97与前面的38 49 比较 不交换38 49 65 97 76 13 27 79

。。。

public class InsertSort {

    public static void main(String[] arg) {
        int[] a=new int[] {49,38,65,97,76,13,27};
        int n=a.length;
        InsertSort(a,n);
    }

    static void InsertSort(int a[],int n) {
        int i,j,temp;
        int h=1;
        // 第1个数只有一个数无法比较  肯定是有序的,所以从第二个数才开始遍历去比较
        for(i=1;i<n;i++) {
            // 取出第i个数,和前i-1个数比较后,插入合适位置
            if(a[i]<a[i-1]) {
                //取一个中间变量存值
                temp=a[i];
                for(j=i-1;j>=0&&a[j]>temp;--j) {
                    // 因为前i-1个数都是从小到大的有序序列,所以只要当前比较的数(list[j])比 
                    //temp大,就把这个数后移一位
                    //例如:i=2,就是第二次排序,如果a[1]>temp=a[2] 则进入循环交换 
                    //a[2]=a[1],--j 后 如果a[0]>temp 则进入循环交换 a[1]=a[0]
                    a[j+1]=a[j];
                }
                //因为--j,所以得加回来
                // 例如:取i=1的时候  49 和 38 比较,循环下来就是 如果a[1]<a[0]  temp=a[1]                                                 
                //a[1]=a[0] a[1]=temp
                a[j+1]=temp;
            }

            //遍历打印每一次插入排序的结果
            for(int c=0;c<n;c++) {
                System.out.print(a[c]+" ");
            }

            //第几次排序
            System.out.println("第"+ h++ +"次排序");

        }
    }
}



运行结果:
38 49 65 97 76 13 27 第1次排序
38 49 65 97 76 13 27 第2次排序
38 49 65 97 76 13 27 第3次排序
38 49 65 76 97 13 27 第4次排序
13 38 49 65 76 97 27 第5次排序
13 27 38 49 65 76 97 第6次排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值