数据结构与算法分析之冒泡排序算法与效率分析

在计算机科学中,排序永远是一个经典的主题。

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 

4、排序效率分析

设有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;
	}
 }

虽然改动并不是很大,但是在遇到本来就已经排好序了的情况下,会减少遍历次数,从而提高效率。比如在对{1,2,3,4,5}进行排序时,优化过后的算法只需要遍历一次就够了。




你可能感兴趣的:(算法,冒泡排序)