谈跟风
工作中有压力很正常,应对压力的办法也有很多。
有的人选择积极应对,有的人选择良木而栖,都很正常。
以前不理解富士康的13连跳,心想,不就是一分工作,大不了不干了啊,为啥跳楼。。。。现在随着工作年限增多,有的时候竟有些许"感同身受"。
那个时候"打工人"还没火起来,广大打工人还没有觉醒。也不像现在一致痛骂"资本家"。
有同事呆不不开心,要离开了,听说跳槽新东家薪资double,心里不安分的念头开始萌芽。
跳槽没问题,跟风跳槽有问题,还是要想想自己想要的是什么,不要冲动性换工作。钱多,事少,离家近,好比鱼和熊掌,难以兼得。
冒泡排序
传送门
插入排序:《数据结构与算法分析》之插入排序
什么是冒泡排序
冒泡排序算是很常用的一种排序算法,还记得刚毕业的时候面试偶尔会碰到,做笔试题。后来多干了几年,好像面试也不问了。
不过还是值得回顾一下:
从未排序的第一个元素开始,依次与相邻元素比较,大的往后浮,小的向前沉,直到元素排序完成;并且比较趟数不一定。
还是以一个整型数组来分析一下
原始数组 | 34 | 8 | 64 | 51 | 32 | 21 |
第一趟之后 | 8 | 34 | 51 | 32 | 21 | 64 |
第二趟之后 | 8 | 34 | 32 | 21 | 51 | 64 |
第三趟之后 | 8 | 32 | 21 | 34 | 51 | 64 |
第四趟之后 | 8 | 21 | 32 | 34 | 51 | 64 |
第五趟,已经排序完成 |
上面一个数组:[34,8,64,51,32,21],有6个元素。
- 第一趟排序:34>8进行交换,34<64不交换,64依次与51,32比较最大,得到第一趟之后结果。第一趟之后,最大元素64已经冒泡到最后一个元素。并且64不再参与后续排序
- 第二趟排序:8<34不改变,34<51不改变,51依次与32,21比较最大,得到第二趟之后结果。第二趟之后,最大元素51已经冒泡到最后一个元素。并且51不再参与后续排序
- 第三趟排序:8<34不改变,34>32,21比较最大,依次交换,得到第三趟之后结果。第三趟之后,最大元素34已经冒泡到最后一个元素。并且34不再参与后续排序
- 第四趟排序:8<32不改变,32>21交换,此时整个数组已经有序了。第四趟之后,最大元素32已经冒泡到最后一个元素。并且32不再参与后续排序
经过上面4趟排序,整个数组已经排序完成。每经过一次排序,则会排出一个最大元素。那么理论上应该要经过6趟才能完全排序完成,那么如何确定排序已经完成,程序结束呢?
可以设置一个标志位,如果排序过程中有元素交换,表示排序未完成,如果无元素交换,表示排序完成,就可以不用进行后续无用的比较提高效率!
java实现
用java代码实现一下上面说到的冒泡排序
public class BubbleSortTest {
/**
* 冒泡排序
*
* @param a
*/
public void bubbleSort(int a[]) {
// 中间变量,用于元素交换
int temp;
// 外层循环,次数为数组的长度
for (int i = 0; i < a.length; i++) {
// 排序循环是否结束的标志
boolean flag = true;
print(a, i);
// 内层循环,比较次数逐渐减少
for (int j = 0; j < a.length - i - 1; j++) {
// 如果当前元素比邻近元素更大,则进行交换,这个就是冒泡的核心代码
if (a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
// 设置结束标志为false,表示有元素交换,不能结束
flag = false;
}
}
if (flag) {
break;
}
}
}
@Test
public void test() {
int sortArray[] = {34, 8, 64, 51, 32, 21};
bubbleSort(sortArray);
}
public void print(int sortArray[], int num) {
System.out.print("冒泡排序比较的趟数:" + num + " ,排序之后的数组:");
for (int i = 0, j = sortArray.length; i < j; i++) {
System.out.print("," + sortArray[i]);
}
System.out.println();
}
}
打印输出
上面代码也是分为2层循环,外层循环次数为数组的长度。内层循环次数为数组长度-当前外层循环-1:
内层循环的次数为什么是这么多呢?因为外层每循环完成一次,内层元素不用跟自身比较所以-1,而且已经排序的元素不用参与排序,每趟就是i个元素,所以-i。
比如
- 第一趟比较,i=0,那么内层循环是j=6-0-1=5次,因为不用跟自身比较
- i=1,内层循环j=6-1-1=4,因为不用跟自身+已经排序的64比较
- i=2,内层循环j=6-2-1=3,因为不用跟自身+已经排序的64,51比较
依次类推
算法总结
- 时间复杂度为O(
)
- 排序趟数与原始序列中数据的排列有关
- 是一种稳定性的排序
冒泡排序适用于原始序列比较有序的情况,效率较高