引言
都说重庆高温进入决赛圈了,可话说重庆那年退出过决赛圈呐。打开手机一看天气预报,依旧稳定发挥:41℃。在此,我要隆重感谢一个人------威利斯·开利,特别感谢你当年的伟大发明(家用空调)。要不是你离得太远,我高低得给你弄点天地银行!
转眼间金九银十又来了,这才刚步入九月,同学们找工作的热情就一点儿不亚于重庆的高温,今天来面试的是一名来自重庆理工的同学,由于她长相比较可爱,我们就暂称她为小爱同学吧。
这里我再多提一点,我们部门对同学们的笔试要求(试卷上二十道选择题,三道分析题),一般刚毕业或即将毕业的同学,只要选择题能对12题,都会给面试机会;1~3年工作经验的同学,做对15道及以上就可以;要是五年工作经验的,就不用做笔试题,直接技术面试。
面试开始,我问的小爱同学第一个问题也是老生常谈,你对面向对象的理解?
小爱同学也是很熟练的对我讲出了封装、继承与多态这三个概念,但在解释多态的时候,她提出了父类引用指向子类对象。我觉得不错,便要她具体解释一下这个概念,显然,她被这突如其来的询问搞沉默了……
过了一会儿,我对她说::“没事”。
接着我又问了她基本数据类型有哪些?可能她还没有回过神,byte类型一直没有想起来。考虑到她是应届毕业生的缘故,我跟她讲:
中间还有一些我就不再多说了,回答都是特别完整。最后,我问了她一个基础算法题:“你可以为我解释一下冒泡排序吗?”
小爱回答:“冒泡排序就是两个数之间比较,如果后面数比前面大,就交换位置,一趟排序下来,最大的那个数就排在最后去了”。
我听后,觉得还有救,于是我便继续问道:“那你方便给我写一下具体代码实现吗?”
十来分钟后,小爱跟我讲:“我忘记具体的代码实现了,但我写了伪代码。”
我心想,那也成,于是便接过草稿纸,说实在,我没有看懂,上面涂涂改改,最让我没有想到的是,上面出现了箭头。
于是,我让她解释一下,可能她那时也懵了,半天没有说出来……
到这,我要将的故事也就说完了。可能有很多朋友会说,冒泡排序,不是有手就行吗?但我想用自己的亲身经历告诉大家,在这么多面试的同学中,很少有同学能成功写出冒泡排序算法。
所以,我也还是那句话:基础算法很重要!基础算法很重要!基础算法很重要!
下面我将为大家讲解一下冒泡排序算法。如果会的朋友,请不要着急离开!可以在心里想一下代码实现,如果不能完整浮现,我还是希望你往下看一眼。如果完全没有代码思路的同学,那就请好好看一下,顺带点个关注,有事没事拿出来翻一下,用不了多久,你就再也忘不了它了(^_^)
什么是冒泡排序?
冒泡排序(Bubble Sort)是排序算法的一种,它的工作方式类似于“气泡上浮”。你可以想象一个装满水的瓶子,瓶底有一堆气泡(这些气泡代表着要排序的数字)。每次你晃动瓶子,最大的气泡会逐渐浮到水面上,类似的,最大的数字会移动到序列的末尾。
冒泡排序的具体步骤
假设我们有一个未排序的数字列表:
[5, 3, 8, 4, 2]
第一步:从头到尾依次比较相邻元素
- 比较5和3:5比3大,交换它们,列表变为
[3, 5, 8, 4, 2]
。 - 比较5和8:5比8小,不交换,列表保持不变。
- 比较8和4:8比4大,交换它们,列表变为
[3, 5, 4, 8, 2]
。 - 比较8和2:8比2大,交换它们,列表变为
[3, 5, 4, 2, 8]
。
经过第一轮比较,最大的数字8已经移动到了列表末尾。
第二步:重复上面的过程
- 比较3和5:3比5小,不交换。
- 比较5和4:5比4大,交换它们,列表变为
[3, 4, 5, 2, 8]
。 - 比较5和2:5比2大,交换它们,列表变为
[3, 4, 2, 5, 8]
。
第二轮之后,第二大的数字5也被放到了正确的位置。
第三步:继续比较直到所有元素有序
- 比较3和4:不交换。
- 比较4和2:4比2大,交换,列表变为
[3, 2, 4, 5, 8]
。 - 比较3和2:交换,列表变为
[2, 3, 4, 5, 8]
。
最终,所有数字按照从小到大的顺序排列,排序完成。
冒泡排序的特性
- 时间复杂度:在最坏和平均情况下,冒泡排序的时间复杂度是 O(n²)。这意味着当数据量很大时,冒泡排序的效率会变得较低。
- 空间复杂度:冒泡排序只需要一个额外的临时变量用于交换数据,因此空间复杂度为 O(1)。
- 稳定性:冒泡排序是稳定的,也就是说如果两个元素相等,它们的相对位置不会改变。
冒泡排序的代码实现
private int[] BubbleSort(int[] array)
{
var temp = 0; // 定义一个临时变量,用于交换两个元素的值
// 外层循环,控制遍历的轮次。i代表当前已经完成排序的轮数
for (int i = 0; i < array.Length; i++)
{
// 内层循环,比较相邻元素并交换。随着每一轮比较,最后i个元素已经排序完毕,可以不再参与比较
for (int j = 0; j < array.Length - 1 - i; j++)
{
// 如果前一个元素大于后一个元素,交换它们的位置
if (array[j] > array[j + 1])
{
temp = array[j]; // 将较大的元素存入临时变量temp
array[j] = array[j + 1]; // 将较小的元素赋给前面的元素位置
array[j + 1] = temp; // 将临时变量中的较大值放到后一个位置
}
}
}
return array; // 返回排序后的数组
}
总结
每年到这个时候,都有很多朋友要找工作或跳槽,都想寻得一个理想的薪资。对于程序员来说,要想迅速提升自己的薪资待遇,那就必须得搭建自己的技术堡垒,但就是在建筑堡垒的同时,越要注意脚下的护城河,如果护城河太浅太窄,很容易被其他竞争者攻陷。我们学的这些基础知识就好比那条护城河,唯有挖的宽,挖的深,自己的堡垒才会越长久,长久了就越能巩固堡垒,越牢固了就越值钱了。