原理
冒泡排序就像烧开水以后的气泡一样从底层慢慢的到顶层慢慢的变大,但是冒泡排序分为 降序和升序。
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
下面咱们对3、9、1、4、2、7、8、6、5进行排序
测试代码
package bean;
import java.util.Arrays;
public class MyTest {
public static void main(String[] args) throws Exception{
int[] array = {3,9,1,4,2,7,8,6,5};
sort(array);
}
public static void sort(int[] array) throws Exception{
if(array == null || array.length == 0){
throw new Exception("数组不正确");
}
int n = array.length;
System.out.println("冒泡排序前...");
for(int i = 0; i< n; i++){
//提前退出冒泡循环的标志位,即一次比较中没有交换任何元素,这个数组就已经是有序的了
boolean success = true;
int temp = 0;
for(int j = 0; j < n -1- i; j++){
//此处你可能会疑问的j<n-i-1,因为冒泡是把每轮循环中较大的数飘到后面,
//数组下标又是从0开始的,i下标后面已经排序的个数就得多减1,总结就是i增多少,j的循环位置减多少
if(array[j] > array[j+1]){
temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
success = false;
}
}
if(success){
break;
}
System.out.println("第" + (i + 1) + "轮后: " + Arrays.toString(array));
}
}
}
上面的程序加个标志位进行了优化减少循环次数,提高程序性能。
执行结果:
冒泡排序前...
第1轮后: [3, 1, 4, 2, 7, 8, 6, 5, 9]
第2轮后: [1, 3, 2, 4, 7, 6, 5, 8, 9]
第3轮后: [1, 2, 3, 4, 6, 5, 7, 8, 9]
第4轮后: [1, 2, 3, 4, 5, 6, 7, 8, 9]
复杂度
时间复杂度最好是O(n),平均是O(n2)