在计算机科学中,排序永远是一个经典的主题。
1、什么是冒泡排序
冒泡排序算法需要遍历多次待排序数组,在每次遍历中,比较相邻的元素。如果某一对元素是降序,则互相交换他们的位置;否则,保持不变。由于较小的值向“气泡”一样逐渐浮向顶部,而较大的值沉向底部,所以称这种技术为冒泡排序或者下沉排序。
2、冒泡排序算法
for (int i = 1; i < list.length; i++) { for (int j = 0; j < list.length-i; j++) { if (list[j]>list[j+1]) { int temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } }3、冒泡排序过程分析
排序前数组为 :int[] list = {1,3,5,4,9,6,7,2};
排序过程为:
第1轮排序过程 1 3 5 4 9 6 7 2 1 3 5 4 9 6 7 2 1 3 4 5 9 6 7 2 1 3 4 5 9 6 7 2 1 3 4 5 6 9 7 2 1 3 4 5 6 7 9 2 1 3 4 5 6 7 2 9 第1轮排序完成 13456729 第2轮排序过程 1 3 4 5 6 7 2 9 1 3 4 5 6 7 2 9 1 3 4 5 6 7 2 9 1 3 4 5 6 7 2 9 1 3 4 5 6 7 2 9 1 3 4 5 6 2 7 9 第2轮排序完成 13456279 第3轮排序过程 1 3 4 5 6 2 7 9 1 3 4 5 6 2 7 9 1 3 4 5 6 2 7 9 1 3 4 5 6 2 7 9 1 3 4 5 2 6 7 9 第3轮排序完成 13452679 第4轮排序过程 1 3 4 5 2 6 7 9 1 3 4 5 2 6 7 9 1 3 4 5 2 6 7 9 1 3 4 2 5 6 7 9 第4轮排序完成 13425679 第5轮排序过程 1 3 4 2 5 6 7 9 1 3 4 2 5 6 7 9 1 3 2 4 5 6 7 9 第5轮排序完成 13245679 第6轮排序过程 1 3 2 4 5 6 7 9 1 2 3 4 5 6 7 9 第6轮排序完成 12345679 第7轮排序过程 1 2 3 4 5 6 7 9 第7轮排序完成 12345679 最终结果: 1 2 3 4 5 6 7 9
设有n个元素,第一次需要比较n-1次,第二次需要n-2次,最后一次只需要比较一次;所以效率为(n-1)+(n-2)......+1=(n-1)n/2 = O(n平方)
5、算法不足与改进
虽然实现了冒泡排序的算法,但是还是有点瑕疵
比如: 有一组数组刚开始都已经排好序了 1,2,3,4,5第一轮遍历结束以后没有发生交换。第二次仍然会去遍历,直到遍历结束。这样就会浪费时间。
现在介绍一个优化了的冒泡排序算法
boolean needNextPass = true;//设置一个变量标志是否需要继续遍历 for (int i = 1; i < list.length && needNextPass; i++) { needNextPass = false; for (int j = 0; j < list.length-i; j++) { if (list[j]>list[j+1]) { int temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; needNextPass = true; } }