冒泡排序是所有排序算法里最为简单的一种,也是面试经常让你手写的一种算法。说实话在此之前我也写不出来冒泡,所以在算法这块我也是下过功夫的,今天我就来通俗讲解冒泡排序的原理,让大家对冒泡有更深对印象,核心代码五行左右,so easy!
首先冒泡对意思是什么呢,鱼在水里吐泡泡的时候,由于压强原因,越上升泡泡越大,所以冒泡排序默认是从小到大排序的算法。
核心思想
将一个数组的前一个数和后一个数做对比,如果前一个数大于后一个数,那么就把这两个数互换位置。
小技巧:
未经优化的冒泡排序
private void test2() {
int[] arr = {12, 23, 34, 56, 6, 6, 78};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
System.out.println(Arrays.toString(arr));
}
下面根假定一个数组 int[] arr = {2, 6, 9, 1}; 来讲解冒泡排序实现的过程
第一次对比:前一个数(值2),后一个数(值6),如果前一个大于后一个则互换,第一次对比完成后数组如下:
第二次对比:,将第二个(值6)和第三个(值9)做对比,第二次对比完成后数组如下:
第三次对比:将第三个(值9)和第四个(值1)做对比,第三次对比完成后数组如下:
第四次对比:将第一个(值2)和第二个(值6)做对比,第四次对比完成后数组如下:
第五次对比:将第二个(值6)和第三个(值1)做对比,第五次对比完成后数组如下:
第六次对比:将第一个(值2)和第二个(值1)做对比,第六次对比完成后数组如下:
上述我说的次数是内层循环的对比次数,也是内层的循环次数,可见有很多循环是没必要的,因为数组并没有更改,所以说直接这样使用冒泡排序是不理想的。我用了4个长度的数组就要循环这么多次,如果长度是几万的那简直是灾难,冒泡排序适用于数组长度在1万以内的。所以我们要对上面对代码进行优化。
优化后的冒泡排序
private void test2() {
int[] arr = {12, 23, 34, 56, 6, 6, 78};
for (int i = 0; i < arr.length - 1; i++) {
boolean isSwap = false;
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
isSwap = true;
}
} //如果当前循环没有发生交换跳出这次
if (!isSwap) {
System.out.println(Arrays.toString(arr));
return;
}
}
System.out.println(Arrays.toString(arr)+"11111111");
}
优化后的冒泡排序只是用在数组可能是顺序的情况下,或者数组前面的元素基本都是顺序的并且后面元素尽量都大于前面的元素,此情况下,效率可能更明显,此时使用冒泡排序最优情况的时间复杂度是:O(n)