《数据结构与算法分析》之插入排序

作者讲述项目组出现P1级故障,感慨写代码的风险及公司管理应讲情怀。重点介绍插入排序算法,阐述其原理,即通过N - 1趟排序使元素有序,还给出Java实现代码,分析了代码逻辑,并总结该算法时间复杂度、稳定性及适用场景。

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

大事记

最近一个星期,项目组发生了一个天大的bug,被定级为P1级别(P级故障,0-5,数字越小影响越大,发生0级故障公司可能就要倒闭了)。

领导吃饭的时候亲口说,会连坐5级;这个故障已经跟CEO汇报了3次都不满意。

据小道消息王子(每个公司,每个部门都会有那么几个消息很灵通的机灵boy)说,写代码的那个哥们可能会被公司辞退。

看来写代码还是一个高危行业!说不定哪天就拉出去祭旗,祭天了。

根据墨菲定律,每个人都不可能100%出错,今天的被辞退的别人,说不定就是明天的,下一个的自己。心底难免升起一丝丝悲凉。公司不会管你的房贷,车贷,花呗,借呗会不会还的起,不会管你是否要养家糊口,总之没用了就要扔掉。

有时候管理需要温度,公司也应该讲情怀。如果公司管理没有温度,不讲情怀,不讲贡献,但是口号天天宣传这些,当你发现的时候,跑路的时候也不要流恋,坚定的转身离去。

要么有离开的勇气,要么有熬下去的决心;如果都没有,有的时候就会上班如上坟,每一秒都是身心煎熬!

工作很重要,始终却只是一份工作。你需要认真的工作,但不可为了工作牺牲自己的健康,家庭,尤其是灵魂!

健康,家庭,灵魂,朋友,工作组成了生命了5个球,唯一只有工作掉在地上,还可以再捡起来,其它任何一样,掉在地上,破碎了就再也难圆。珍惜身边的家人,朋友,尊重自己的内心。

最后,毕竟是技术人,对代码多一份敬畏之心!

插入排序

在学校的时候学过数据结构与算法,当时还是C语言的。

后来工作这么多年,也用的不多,这部分看的也不多。

最近总觉基础不牢,天天写应用代码是不够,所以打算花点时间系统再复习一下。说复习都夸张了,因为学校的时候也没怎么学好,应该是再学习一遍。

什么是插入排序

插入排序是相对比较简单的一种算法(insertion sort)。

插入排序由N-1趟排序组成,对于p=1到N-1趟排序保证从位置0到位置p上的元素为已排序状态。

插入排序基于这样的一个事实:位置0到位置p-1上的元素已经处于排过序的状态。

看一个例子分析一下:

原始数组34864513221移动的位置

p=1 趟之后

 

p=2 趟之后

 

p=3 趟之后 

 

p=4 趟之后 

 

 p=5 趟之后

8

 

8

 

8

 

8

 

8

34

 

34

 

34

 

32

 

21

64

 

64

 

51

 

34

 

32

51

 

51

 

64

 

51

 

34

32

 

32

 

32

 

64

 

51

21

 

21

 

21

 

21

 

64 

1

 

0

 

1

 

3

 

 

上面一个数组:[34,8,64,51,32,21],有6个元素。

  • p=1趟时,34与8比较,排序结果为[8,34]
  • p=2趟时,将64与[8,34]比较,不用移动元素位置,排序结果为[8,34,64]
  • p=3趟时,将51与[8,34,64]比较,51在34与64中间,经过一次比较得到排序结果[8,34,51,64]
  • p=4趟时,将32与[8,34,51,64],找到合适位置在8与34中间,经过3次比较,得到排序结果[8,32,34,51,64]
  • p=5趟时,将21与[8,32,34,51,64],找到合适位置在8与32中间,经过4次比较,得到排序结果[8,21,32,34,51,64]

一共进行了5趟排序,然后数组变成了有序。下面我们用java程序来实现一下

java实现

用java代码实现一下上面说到的插入排序

public class InsertionSortTest {

    @Test
    public void test() {
        int sortArray[] = {34, 8, 64, 51, 32, 21};
        insertionSort(sortArray);

        for (int i = 0, j = sortArray.length; i < j; i++) {
            System.out.println("排序之后的数组结果:" + sortArray[i]);
        }
    }

    /**
     * 插入排序算法
     *
     * @param a
     */
    private void insertionSort(int a[]) {
        int j;
        // 外层循环,共N-1趟
        for (int p = 1; p < a.length; p++) {
            // 每一趟需要排序的元素,用tmp来记录这个变量
            int tmp = a[p];
            // 内层循环,用tmp对数组前p-1位置上的每一个元素比较,如果发现变量比被比较位置上的元素小,就将当前元素向前移动
            for (j = p; j > 0 && tmp < a[j - 1]; j--) {
                a[j] = a[j - 1];
            }
            // 将空出来的位置tmp填充
            a[j] = tmp;
        }
    }
}

打印的结果

上面代码共分为2层循环,

  • 外层循环就是N-1趟,比如{34, 8, 64, 51, 32, 21}这个数组,6个元素,会共进行5趟比较。
  • 内层循环就是将位置为p上的元素a[p]与前面已经排序的元素进行比较,碰到比a[p]小的元素,就将被比较位置上的元素向前移动一个位置
  • 最后将空出来的位置上,填充a[p]

上面的过程演示了这个算法为什么叫插入排序,就是将比较元素不断的插入到合适位置的过程

当然在实际的java程序中,可能会用对象比较:如果对象是可比较的(实现了Comparable接口),上面的内循环比较可以用compareTo方法

对象排序的例子

算法总结

  • 时间复杂度为O(n^{2})
  • 是一种稳定性排序
  • 插入排序适用于已经有部分数据已经排好,并且排好的部分越大越好
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值