基本思想
冒泡排序(Bubble Sort)通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序(前后大小与要求的顺序不一致)则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
代码实现
public class BubbleSort {
/**
* 按照从小到达的顺序进行排序
* @param array 要进行排序的数组
*/
public static void bubbleSort(int[] array){
int temp = 0;//用于前后元素交换时使用
//数组有n个元素,排序只需n-1次就能完成
for (int i = 0; i <array.length-1 ; i++) {
for (int j = 0; j <array.length-1-i ; j++) {
if (array[j]>array[j+1]){//前后元素进行交换,可以看出冒泡算法是一种交换算法
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
}
代码解释:
测试数组:int[] array = {23,9,-2,-1,8,99,100,91};
执行结果:
算法优化
可以从上述的每一趟的输出结果可以看出,在第二次排序完成后整个数组就已经按照从小到大的顺序排列了,后面的几次循环只是在执行if语句,而实际上并没有进行排序。浪费了时间和空间
优化:
int temp = 0;//用于前后元素交换时使用
boolean isChanged = false;//标识变量,记录数组是否提前完成了排序
//数组有n个元素,排序只需n-1次就能完成
for (int i = 0; i <array.length-1 ; i++) {
for (int j = 0; j <array.length-1-i ; j++) {
if (array[j]>array[j+1]){
isChanged =true;//证明元素交换过,即数组还未完全有序
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
if (!isChanged){
break;//左右元素未交换,说明数组已完成排序,结束排序循环
}
System.out.printf("第%d次排序结果",i+1);
System.out.println(Arrays.toString(array));
isChanged = false;//重置,用于下次判断,这个重置非常重要
}
执行结果:
可以看出来for循环只执行了两次就结束并完成了数组的排序