大事记
最近一个星期,项目组发生了一个天大的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上的元素已经处于排过序的状态。
看一个例子分析一下:
原始数组 | 34 | 8 | 64 | 51 | 32 | 21 | 移动的位置 |
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
4 |
上面一个数组:[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(
)
- 是一种稳定性排序
- 插入排序适用于已经有部分数据已经排好,并且排好的部分越大越好