排序算法之冒泡排序

冒泡排序

Posted by     DH on July 11, 2017

思想

冒泡排序的思想就是,两两比较相邻的两个数,按照升序或者降序进行交换。这样交换一趟之后,最大或者最小的数字就被交换到最后一位, 接着从头开始,继续进行迭代的比较,直到倒数第二位,以此类推。

例子

例如要对 6 7 4 1 5 9 进行升序的冒泡排序操作,过程如下:

  • 第一趟

第一次比较6和7 6 < 7,不交换

交换前状态 6 7 4 1 5 9
交换后状态 6 7 4 1 5 9

第二次比较7和4 7 > 4,交换

交换前状态 6 7 4 1 5 9
交换后状态 6 4 7 1 5 9

第三次比较7和1 7 > 1,交换

交换前状态 6 4 7 1 5 9
交换后状态 6 4 1 7 5 9

第四次比较7和5 7 > 5,交换

交换前状态 6 4 1 7 5 9
交换后状态 6 4 1 5 7 9

第五次比较7和9 9 > 7,不交换

交换前状态 6 4 1 5 7 9
交换后状态 6 4 1 5 7 9
  • 第二趟

第一次比较6和4 6 > 4,交换

交换前状态 6 4 1 5 7 9
交换后状态 4 6 1 5 7 9

第二次比较6和1 6 > 1,交换

交换前状态 4 6 1 5 7 9
交换后状态 4 1 6 5 7 9

第三次比较6和5 6 > 5,交换

交换前状态 4 1 6 5 7 9
交换后状态 4 1 5 6 7 9

第四次比较6和7 7 > 6,不交换

交换前状态 4 1 6 5 7 9
交换后状态 4 1 5 6 7 9
  • 第三趟

第一次比较4和1 4 > 1,交换

交换前状态 4 1 5 6 7 9
交换后状态 1 4 5 6 7 9

第二次比较4和5 5 > 4,不交换

交换前状态 1 4 5 6 7 9
交换后状态 1 4 5 6 7 9

第三次比较5和6 6 > 5,不交换

交换前状态 1 4 5 6 7 9
交换后状态 1 4 5 6 7 9
  • 第四趟

不交换

  • 第五趟

不交换

分析

可以看到,一共需要n-1趟,而每一趟过后,都有一个元素进入有序序列,那么比较的元素就要减少一个。

综上分析,需要两层循环,外循环确定趟数,内循环确定每一趟的次数。

代码

  package test;

import java.util.Arrays;

public class BubbleSort {

	public static void main(String[] args) {
		
		BubbleSort bubbleSort = new BubbleSort();
		int []a = {67, 69, 75, 87, 89, 90, 99, 100};
		bubbleSort.bubbleSort(a);
		System.out.println(Arrays.toString(a));
	}
	public void bubbleSort(int [] a){
		if (a == null || a.length == 0) {
			return;
		}
		
		
		for(int i = 0; i < a.length - 1; i++){// 外层循环次数,要比较n-1个数
			
			for(int j = 0;j < a.length - 1 -i; j++ ){
				
				if (a[j] > a[j+1]) {
					int temp = a[j];
					a[j] = a[j + 1];
					a[j+1] = temp;
				}
			}
			
		}
		
		
	}
}


复杂度分析

根据代码分析,时间复杂度是O(n2)

最好情况是数组有序,为O(n)

最坏情况均是反序,为O(n2)。

冒泡排序是一种稳定排序。