冒泡排序-算法及优化
前言
喝汽水时,大家会发现一个个小气泡从瓶底慢慢浮到水面。这一情景形象地反映了冒泡排序的过程。冒泡排序(Bubble Sort)是一种简单的排序算法。通过依次比较相邻两个元素的大小,逆序则交换,使较大(或较小)元素经过不断的交换慢慢移动到数列的末端,最终使全部元素达到有序的状态。
实例
以数组 [3,5,4,2,1] 为例,希望实现从小到大排序,过程如下:
第一轮排序:
1.比较3和5的大小,因为3<5,符合小→大的顺序要求,因此不交换位置,数组仍为:[3,5,4,2,1] ;
2.比较5和4的大小,因为5>4,不符合小→大的顺序要求,因此交换位置,此时数组变为[3,4,5,2,1];
3.比较5和2的大小,5>2,交换,数组为[3,4,2,5,1];
4.比较5和1的大小,5>1,交换,数组为[3,4,2,1,5];
至此,数组的最大值已经“浮到”了数组末端。
第二轮排序:
1.比较3和4的大小,3<4,不交换,仍为[3,4,2,1,5];
2.比较4和2的大小,4>2,交换,数组为[3,2,4,1,5];
3.比较4和1的大小,4>1,交换,数组为[3,2,1,4,5];
4.比较4和5的大小,4<5,不交换,仍为[3,2,1,4,5];
至此,数组次大值也“浮到”了数组末端。
以此类推,再经过两轮排序后,就可以实现数组由小到大的排序。
原理
根据以上实例,不难总结出实现原理:
利用嵌套循环,内循环负责依次比较相邻数据的大小,顺序不对,则交换位置。外循环负责找到本轮数据中的最大值并置于最后。具体描述如下:
1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。结束后,最后的元素应该会是最大的数。
3.持续对越来越少的元素对重复上面的步骤,直到没有任何一对数字需要比较。
代码实现
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int [] arry = {3,5,4,2,1};
for (int i = 0; i < arry.length-1; i++) {
for (int j = 0; j < arry.length-1-i; j++) {
if ( arry[j] > arry[j+1] ){
int temp = arry[j]; //若前面的元素>后面的元素则交换
arry[j] = arry [j+1];
arry[j+1] = temp ;
}
}
}
System.out.println(Arrays.toString(arry)); // 输出数组内容
}
}
优化
如果在某次排序中,没有发生任何交换,则表明元素的排列达到了有序,之后的判断便失去了意义,应该提前结束循环。代码如下:
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arry = {3, 5, 4, 2, 1};
int count = 0;
for (int i = 0; i < arry.length - 1; i++) {
for (int j = 0; j < arry.length - 1; j++) {
if (arry[j] > arry[j + 1]) {
count++; //只要出现元素交换,则count+1
int temp = arry[j]; //若前面的元素>后面的元素则交换
arry[j] = arry[j + 1];
arry[j + 1] = temp;
}
} if(count == 0){ //若没有元素交换位置,则退出循环
break;
}else count = 0; //重置count,进行下一次判断
} System.out.println(Arrays.toString(arry)); // 输出数组内容
}
}
声明
个人能力有限,不足之处,请多指正
文章为原创,欢迎转载,注明出处即可
谢谢观看,欢迎交流