经典排序之冒泡排序
冒泡排序(Bubble Sort)是一种比较经典的排序算法。
之所以称为“冒泡排序” ,是因为在排序中,越大(降序排列)或越小(升序排列)的相邻元素会经由交换逐渐“浮”到前面,有如 水中浮出的水泡,故形象地命名为“冒泡排序”。
冒泡排序主要对相邻的两个元素进行比较。
在时间复杂度方面,若数据集的初始状态是正序的,一趟扫描即可完成排序。这时,排序中的比较 次数和移动次数均达到最小值,其时间复杂度O(N)。
若数据集的初始状态是反序的,需要进行n-1趟排序;每趟排序要进行n-i次关键字的比较 (1≤i≤n-1)。在这种情况下,比较和移动次数均达到最大值,其时间复杂度为O(n²)。
总的来说,冒泡排序的平均时间复杂度为O(n²)。
我们接下来通过代码来看冒泡排序。
package 排序算法.冒泡排序;
import java.util.Arrays;
/**
* 未优化的冒泡排序
*/
public class Demo1 {
public static void main(String[] args) {
int[] arr = new int[]{15, 32, 14, 86, 54, 78, 36};
System.out.println("排序前的数组:" + Arrays.toString(arr));
System.out.println("排序中:");
int k = 0;
for (int j = 0; j < arr.length - 1; j++) {
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
System.out.println("第 " + (++k) + " 次:" + Arrays.toString(arr));
}
}
System.out.println("排序后的数组:" + Arrays.toString(arr));
}
}
上述代码运行结果如下:
排序前的数组:[15, 32, 14, 86, 54, 78, 36]
排序中:
第 1 次:[15, 32, 14, 86, 54, 78, 36]
第 2 次:[15, 14, 32, 86, 54, 78, 36]
第 3 次:[15, 14, 32, 86, 54, 78, 36]
第 4 次:[15, 14, 32, 54, 86, 78, 36]
第 5 次:[15, 14, 32, 54, 78, 86, 36]
第 6 次:[15, 14, 32, 54, 78, 36, 86]
第 7 次:[14, 15, 32, 54, 78, 36, 86]
第 8 次:[14, 15, 32, 54, 78, 36, 86]
第 9 次:[14, 15, 32, 54, 78, 36, 86]
第 10 次:[14, 15, 32, 54, 78, 36, 86]
第 11 次:[14, 15, 32, 54, 36, 78, 86]
第 12 次:[14, 15, 32, 54, 36, 78, 86]
第 13 次:[14, 15, 32, 54, 36, 78, 86]
第 14 次:[14, 15, 32, 54, 36, 78, 86]
第 15 次:[14, 15, 32, 54, 36, 78, 86]
第 16 次:[14, 15, 32, 36, 54, 78, 86]
第 17 次:[14, 15, 32, 36, 54, 78, 86]
第 18 次:[14, 15, 32, 36, 54, 78, 86]
第 19 次:[14, 15, 32, 36, 54, 78, 86]
第 20 次:[14, 15, 32, 36, 54, 78, 86]
第 21 次:[14, 15, 32, 36, 54, 78, 86]
第 22 次:[14, 15, 32, 36, 54, 78, 86]
第 23 次:[14, 15, 32, 36, 54, 78, 86]
第 24 次:[14, 15, 32, 36, 54, 78, 86]
第 25 次:[14, 15, 32, 36, 54, 78, 86]
第 26 次:[14, 15, 32, 36, 54, 78, 86]
第 27 次:[14, 15, 32, 36, 54, 78, 86]
第 28 次:[14, 15, 32, 36, 54, 78, 86]
第 29 次:[14, 15, 32, 36, 54, 78, 86]
第 30 次:[14, 15, 32, 36, 54, 78, 86]
第 31 次:[14, 15, 32, 36, 54, 78, 86]
第 32 次:[14, 15, 32, 36, 54, 78, 86]
第 33 次:[14, 15, 32, 36, 54, 78, 86]
第 34 次:[14, 15, 32, 36, 54, 78, 86]
第 35 次:[14, 15, 32, 36, 54, 78, 86]
第 36 次:[14, 15, 32, 36, 54, 78, 86]
排序后的数组:[14, 15, 32, 36, 54, 78, 86]
上述是未优化的结果;,优化后的代码如下:
package 排序算法.冒泡排序;
import java.util.Arrays;
/**
* 优化后的冒泡排序;相邻元素比较,小的浮上来
*/
public class Test {
static void bubleSort(int[] intArr){
int k=0;//统计每次排序后的状态
for(int i=0;i<intArr.length-1;i++){
boolean boo=false;//判断数组是否存在无序状态,false表示已经有序
for(int j=0;j<intArr.length-1;j++){
if(intArr[j]>intArr[j+1]){
boo=true;
int temp=intArr[j];
intArr[j]=intArr[j+1];
intArr[j+1]=temp;
}
}
if(!boo){
break;//如果数组已经有序,则不必再循环
}
k++;
System.out.println("第"+k+"次排序:"+ Arrays.toString(intArr));
}
}
public static void main(String[] args) {
int[] arr=new int[]{15,32,14,86,54,78,36};
System.out.println("排序前的数组:"+Arrays.toString(arr));
bubleSort(arr);
System.out.println("排序后的数组:"+Arrays.toString(arr));
}
}
上述代码运行结果如下:
排序前的数组:[15, 32, 14, 86, 54, 78, 36]
第1次排序:[15, 14, 32, 54, 78, 36, 86]
第2次排序:[14, 15, 32, 54, 36, 78, 86]
第3次排序:[14, 15, 32, 36, 54, 78, 86]
排序后的数组:[14, 15, 32, 36, 54, 78, 86]
可见,优化后的代码,比原先重复排序(36-3=33)减少33次之多。