冒泡排序||Bubble Sort

巧了我就是萌 提交于 2019-12-30 20:06:10

冒泡排序||Bubble Sort

自我学习总结之冒泡排序(bubble sort)

what?

这个算法的名字由来是因为越小/大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”

摆原理

1、从第一个元素开始,比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。此时,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后排好的元素。
4、重复以上步骤,知道所有元素有序。

假如现有数组:int[] array = new int[] {9,8,7,6,5,4,3,2,1,0};

经过冒泡排序:

0次排序:9 8 7 6 5 4 3 2 1 01次排序:8 7 6 5 4 3 2 1 0 92次排序:7 6 5 4 3 2 1 0 8 93次排序:6 5 4 3 2 1 0 7 8 94次排序:5 4 3 2 1 0 6 7 8 95次排序:4 3 2 1 0 5 6 7 8 96次排序:3 2 1 0 4 5 6 7 8 97次排序:2 1 0 3 4 5 6 7 8 98次排序:1 0 2 3 4 5 6 7 8 99次排序:0 1 2 3 4 5 6 7 8 9 

在0和1次排序之间详细过程为:

0_0次排序:9 8 7 6 5 4 3 2 1 00_1次排序:8 9 7 6 5 4 3 2 1 00_2次排序:8 7 9 6 5 4 3 2 1 00_3次排序:8 7 6 9 5 4 3 2 1 00_4次排序:8 7 6 5 9 4 3 2 1 00_5次排序:8 7 6 5 4 9 3 2 1 00_6次排序:8 7 6 5 4 3 9 2 1 00_7次排序:8 7 6 5 4 3 2 9 1 00_8次排序:8 7 6 5 4 3 2 1 9 00_9次排序:8 7 6 5 4 3 2 1 0 9 

上代码

public  void bubbleSort(int[] array) {
	for (int i = 0; i < array.length-1; i++) {
		for (int j = 0; j < array.length-i-1; j++) {
			if (array[j]>array[j+1]) {
				int temp = array[j];
				array[j] = array[j+1];
				array[j+1] = temp;
			}
		}
	}

时间复杂度

百度百科上说的很好,直接引进来:

这里是引用

稳定性

当比较的两个数相等时,不会发生交换,所以相等的两个数相对顺序没变,所以冒泡排序是一种稳定排序算法。

优化

假如初始数组就是有序的,但是按照上述代码我们还是要比较n-1次,针对这个问题我们进行优化。
解决方案:

1、设置标志位flag,如果发生了交换flag设置为true;如果没有交换就设置为false。
2、这样当一轮比较结束后如果flag仍为false,即:这一轮没有发生交换,说明数据的顺序已经排好,没有必要继续进行下去。

优化后代码:

	public static void Sort(int[] array) {
		boolean flag;// 是否交换的标志
		for (int i = 0; i < array.length - 1; i++) {
			flag = false;// 每次遍历标志位都要先置为false,才能判断后面的元素是否发生了交换
			for (int j = 0; j < array.length - i - 1; j++) {
				if (array[j] > array[j + 1]) {
					int temp = array[j];
					array[j] = array[j + 1];
					array[j + 1] = temp;
					flag = true;//只要有发生了交换,flag就置为true
				}
			}
			if (!flag) break; // 判断标志位是否为false,如果为false,说明后面的元素已经有序,就直接return
		}
	}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!