vlambda博客
学习文章列表

在生活中学习数据结构(十):排序算法之冒泡排序

      今年准备8岁的女儿说喜欢住酒店,之前一直跟她说住酒店是要花钱的(只能怪她老豆没有钱),不过今年三月三全广西放假我们也是在外面度过的,不管赶夜路要多晚,只要她知道可以住酒店,她就很开心,我顿时觉得我之前一直是错的,目光短浅且虑事不周,大禹治水为何能成功?他爸是用堵的方法,哪里泄了堵哪里,最后发现堵不住啊,而大禹却是用疏导的方法,把洪水疏导到有用的地方去,顺着这个思路,之后就跟女儿说如果你很喜欢住酒店,那你长大了要拥有自己的酒店,随便想什么时候去住都可以,为了去哪里都有酒店住,那就要在全国各地都要有酒店,她好像接受了这个观点,我又说到有自己的酒店就要自己做好账本算好数才知道赚不赚钱那数学一定要学好;管理员工和酒店规章制度都要写那语文要学好;如果想在自己的酒店挂上自己画那画画要学好;如果酒店想开到国外去,在国外也有酒店住,三年级开始学习的英语就要学好。好像她是听进去了,我想如果现在在心里种下了拥有自己酒店的梦想应该也是不错的吧,毕竟人如果没有梦想跟咸鱼有什么区别?

其实这个事情是否合适今天的话题我也不知道,只是想说遇到问题的时候,我们考虑这个问题和问题解决方案首先考虑的是什么其次考虑的是什么,这些考虑的次序有没有一个最优的排序算法,比如之前跟女儿说的住酒店需要花钱,完全是站在自己的角度考虑问题,才去考虑或根本不考虑过女儿提出这个想法时她的心理活动,不过这对于自己来说可能是一个最好的排序算法,但对于女儿来说可能却是最差的排序算法。

东汉末年时期的司马防(他的孙子就是司马昭之心路人皆知的那个司马昭),他有八个儿子,每个儿子的字当中都有一个达字,比如司马朗字伯达,司马懿字仲达,所以这8兄弟在当时人称司马八达,不过后来古希腊文明传入中国,人们就把他们八兄弟简称为斯巴达,呃,好像哪里不对了,先不讨论这个问题,回到排序算法的正题上,现在假设这司马八达胡乱站成一排,如何将他们按年龄大小来排序呢?这里将介绍排序算法里面最经典的算法:冒泡排序算法。它的排序原理是从头开始俩俩比较,小的放前面大的放后面,依次往后,比完一轮过后,最大的数是不是就在最后面了?具体来说比如现在胡乱站成一排的司马八达,注意是依次俩俩相比,就是位置一和位置二比,把年龄大的排在后面,然后到位置二和位置三比,又把年龄大的排后面,然后到位置三和位置四比,又把年龄大的排后面,依次交替比较下去,轮到位置七和位置八相比,又把年龄大的排在后面,这样一轮比较过后是不是年龄最大的那个x达就排在最后面了?这过程是不是很像水里的泡泡一样越往上浮就越大?所以这个排序算法就取名为冒泡排序算法。第一轮过后年龄最大的排在最后了,那就要进入第二轮比较,因为要把年龄第二大的往后冒泡,这一轮的第七位置和第八位置(第一轮过后最大年龄的x达已经在第八的位置)还有比较的必要吗?没有必要了,所以每比较完一轮,下一轮的比较次数要减去一次,有些人可能会问了,不减行不行?我说你这么一问好像周星驰问柳飘飘,不上班行不行?不上班你养我啊,喂,我养你啊,据说这段堪称教科书般的演技,张柏芝抱着周星驰的《演员的自我修养》在车上哭笑一体的特写镜头可以说是张柏芝出道即巅峰了,哎呀又扯远了。回归冒泡排序算法,其实如果不考虑算法的时间复杂度,不减少比较次数也没问题,因为就算全部再比较也不会被交换位置,后面的已经是大的了嘛,但是要考虑如果排序的不只是司马八达而是百亿千亿数量级的呢?自己细品吧。下图是网上转来的,虽不是以司马八达为例,但应该看得更加清楚明白冒泡排序算法的过程。


冒泡排序算法不一定是大的排后面,把小的放后面或者大的放前面也是有的,看实际情况而定,原理都是一样的,实现稍微不同而已,况且数据结构不讲实现只讲算法。还有排序算法有很多种,冒泡排序是考试和面试中比较多见到的,所以先撸为敬。