今天再来回顾一下冒泡排序。冒泡排序(Bubble Sort) 是一中最基本的算法,也应该是最熟悉和最常见的算法了。何为冒泡?就像是我们在刚刚打开一瓶雪碧的时候(尤其是你摇晃几下之后再打开),里面有非常的气泡咕噜咕噜地冒出来,总体来说是一个一个的冒出来的,所以我们熟知的冒泡排序可以简单的理解为一个一个的排列。
而冒泡排序就是按照一定的规则进行排序的(由小到大或者由大到小),先用一个例子来解释
比如,有8个数组成的一个无序的数组,现在的要求是要把它们进行从小到大排序。按照冒泡排序的思想,我们要把相邻的两个元素进行比较,根据我们的要求按照大小交换位置,过程如下:
- 首先需要让5和8 进行比较,发现5小于8 ,因此位置不变。
- 然后让8与6比较,发现8比6大,所以交换8和6的位置。
- 继续让8和3进行比较,发现8比3大,同样交换位置。
- 继续让8与9进行比较,发现8比9小,因此 位置不变。
- 然后用9与2进行比较,发现9比2大,交换两者位置
- 继续让9与1比较,发现9比1大,交换两者位置。
- 最后9与7进行比较,发现9比7大,交换位置。
这样一来,我们通过几次比较,已经把最大的数放到了整个数组的最后。然后再次从头开始,用5与6进行比较,等到第二轮比较结束时,我们得到的数组是这样的:
第三轮结束是这样的:
如此循环,当我们把所有把第8次(数组的长度)比较结束时,我们就已经得到我们想要的由小到大的数组了。
原始的冒泡排序是稳定排序,由于这种排序的算法是每一轮都要遍历所有的元素,轮转的次数和元素的数量相当,所以时间复杂度是o(N^2) 。
上面的原始的冒泡排序我们很容易发现问题,因为每当我们进行一轮排序的时候,最后面的几个数就已经是满足我们的排序的条件了,所以我们可以不用在进行比较。因为我们是先以第一个元素为基准,依次进行比较,直到数组中的最后一个元素,那么也就是说,第一轮结束之后,最后的元素已经是数组中最大的那个数了。那么再进行第二轮的时候,就没有必要再和最后一个数进行比较了(因为已经是整个数组最大的数了)。第二轮之后,数组最后两个数是符合我们的排序规则的,并且是在第三轮不需要再次比较的。
由此我们就可以发现一个规律,每一轮之后,都会出现一个一个符合我们排序规则的数,并在正确的位置上,所以我们可以利用数组的长度(数组中元素的个数),来做一个排序的优化。当第二轮排序的时候,不和最后一个进行比较,第三轮不和最后两个进行比较...第N轮 不和 最后(N-1)个数进行比较,以此来优化我们的冒泡排序。
冒泡排序回顾到此结束,只作回顾,不作其他。