数据结构算法之冒泡排序

冒泡排序的思想比较简单:相邻的数据进行两两比较,小数放在前面,大数放在后面,这样一趟下来,最大的数就被排在了最后一位,第二趟也是如此,如此类推,直到所有的数据排序完成。

我们在开始接触的时候,只知道排序是把int数组按照从小到大或者从大到小排序,如果排序的是对象呢?所以我们要明确排序是按照什么来排序。排序指的是将一个数据元素的任意序列,重新排列成一个按照关键字有序的序列。

算法思路:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

假如有n个元素需要从小到大排序,当第二步做完,最大的元素会在最后面,所以每比较完一轮可以把最后一个元素的位置排除即n-1。接下来只需要对其余n-1个数据进行两两比较,依然从头开始比较,第二轮下来第二大的数据就尾部倒数第二的位置了,重复上述过程直到数据有序为止。写法如下:

冒泡排序

我之所以在里面加了一个tag,是因为排序的时候,可能在某一轮数组已经是有序的了,以后的比较就没有意义,所以当tag为true时,说明后面已经没有交换的元素的了。假如有n个元素那就需要比较n-1次,如果在第一轮比较就已经完成,则后面的n-1-1次的比较将毫无意义,如图:


图2:没有加tag

图2中没有加tag,导致后面的几次排序都无效。

适用场景:

经过上述过程我们了解到冒泡排序的过程存在大量的比较,即使经过上面一个小小的优化,如果数据量特别大并且大部分无序的,同样需要大量的两两比较,时间复杂度最好最坏均为O(n2),所以冒泡排序适用于数据量非常小的排序。

你可能感兴趣的:(数据结构算法之冒泡排序)