两句话:
在每次循环中,依次比较相邻两个元素,如果顺序错误就交换。
因为每次循环中有一个数排到了末尾,因此下次循环将不会比较这个数。
为了更方便理解,这里用图示来讲解。
首先这里有个数组,如下图:
我需要将数组进行从小到大的排序。
第一次循环:
第0位与第1位比较,8 与 5比较,8 > 5,因此交换,同时要比较的数移到下一位:
接下来第1位与第2位比较,比较8 与 7,8 > 7,因此交换,同时要比较的数移到下一位:
剩下的以此类推,直到第一次循环结束:
第二次循环:
第二次循环与第一次循环有什么不同呢?因为最大的数移到了最末,所以第二次循环不再对比最末位。
结果如下:
第三次循环:
第三次循环对比第二次有什么不同呢?因为第二大的数移到了倒数第二位,所以第三次循环不再对比倒数第二位以及最末位。
第四次循环:
同上。
第五次循环:
到第五次循环的时候,需要对比的只剩下了一位数,这也没法再对比了,所以这个时候循环结束。
如果将以上的过程用代码描述的话,就是这样:
Java代码:
//冒泡排序
public static int[] bubleSort(int[] array) {
//大循环,即是总的要排序的次数,到最后只剩一个数无法对比时结束,因此是从0到array.length-1
for(int i = 0; i < array.length - 1; i++) {
//小循环,即是依次对比的次数,大循环每循环一次小循环减少一次循环
//因此是从0到array.length-1-i
for(int j = 0; j <array.length - 1 - i; j++) {
//依次两两对比,如果顺序不对则交换
if(array[j] < array[j + 1]) {
int tempArray = array[j];
array[j] = array[j + 1];
array[j+1] = tempArray;
}
}
}
return array;
}
每次循环中,通过依次两两对比将符合条件的数放到最后,就像气泡浮到最顶上一样。因此将这种算法称为冒泡排序。
至于这个算法的时间复杂度和空间复杂度,那就不是这篇文章该说的事了。