冒泡排序详解(程序员必须掌握算法之一,居然有这么多求职者不会写)

引言

都说重庆高温进入决赛圈了,可话说重庆那年退出过决赛圈呐。打开手机一看天气预报,依旧稳定发挥:41℃。在此,我要隆重感谢一个人------威利斯·开利,特别感谢你当年的伟大发明(家用空调)。要不是你离得太远,我高低得给你弄点天地银行!

192592b73361439694f6ee9546bf55d5.png

转眼间金九银十又来了,这才刚步入九月,同学们找工作的热情就一点儿不亚于重庆的高温,今天来面试的是一名来自重庆理工的同学,由于她长相比较可爱,我们就暂称她为小爱同学吧。

这里我再多提一点,我们部门对同学们的笔试要求(试卷上二十道选择题,三道分析题),一般刚毕业或即将毕业的同学,只要选择题能对12题,都会给面试机会;1~3年工作经验的同学,做对15道及以上就可以;要是五年工作经验的,就不用做笔试题,直接技术面试。

面试开始,我问的小爱同学第一个问题也是老生常谈,你对面向对象的理解?

小爱同学也是很熟练的对我讲出了封装、继承与多态这三个概念,但在解释多态的时候,她提出了父类引用指向子类对象。我觉得不错,便要她具体解释一下这个概念,显然,她被这突如其来的询问搞沉默了……

过了一会儿,我对她说::“没事”。

接着我又问了她基本数据类型有哪些?可能她还没有回过神,byte类型一直没有想起来。考虑到她是应届毕业生的缘故,我跟她讲:

9eda2e8e9d6e431083292b519dcfafaa.png

中间还有一些我就不再多说了,回答都是特别完整。最后,我问了她一个基础算法题:“你可以为我解释一下冒泡排序吗?”

小爱回答:“冒泡排序就是两个数之间比较,如果后面数比前面大,就交换位置,一趟排序下来,最大的那个数就排在最后去了”。

我听后,觉得还有救,于是我便继续问道:“那你方便给我写一下具体代码实现吗?”

十来分钟后,小爱跟我讲:“我忘记具体的代码实现了,但我写了伪代码。”

我心想,那也成,于是便接过草稿纸,说实在,我没有看懂,上面涂涂改改,最让我没有想到的是,上面出现了箭头。

于是,我让她解释一下,可能她那时也懵了,半天没有说出来……

a759219bec9c464c8ff484b4d3eb5eae.png

到这,我要将的故事也就说完了。可能有很多朋友会说,冒泡排序,不是有手就行吗?但我想用自己的亲身经历告诉大家,在这么多面试的同学中,很少有同学能成功写出冒泡排序算法。

所以,我也还是那句话:基础算法很重要!基础算法很重要!基础算法很重要!

下面我将为大家讲解一下冒泡排序算法。如果会的朋友,请不要着急离开!可以在心里想一下代码实现,如果不能完整浮现,我还是希望你往下看一眼。如果完全没有代码思路的同学,那就请好好看一下,顺带点个关注,有事没事拿出来翻一下,用不了多久,你就再也忘不了它了(^_^)

什么是冒泡排序?

冒泡排序(Bubble Sort)是排序算法的一种,它的工作方式类似于“气泡上浮”。你可以想象一个装满水的瓶子,瓶底有一堆气泡(这些气泡代表着要排序的数字)。每次你晃动瓶子,最大的气泡会逐渐浮到水面上,类似的,最大的数字会移动到序列的末尾。

8ab561b16e7841d18ea3908c023fa9f6.gif

 

冒泡排序的具体步骤

假设我们有一个未排序的数字列表:

[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; // 返回排序后的数组
}

总结

每年到这个时候,都有很多朋友要找工作或跳槽,都想寻得一个理想的薪资。对于程序员来说,要想迅速提升自己的薪资待遇,那就必须得搭建自己的技术堡垒,但就是在建筑堡垒的同时,越要注意脚下的护城河,如果护城河太浅太窄,很容易被其他竞争者攻陷。我们学的这些基础知识就好比那条护城河,唯有挖的宽,挖的深,自己的堡垒才会越长久,长久了就越能巩固堡垒,越牢固了就越值钱了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值