1,原理
相邻元素两两比较,大的往后放(以从小到大排序为例)。第一次完毕后,最大值就出现在了最大索引处。也就是说,冒泡排序每经过一次,至少有一个元素处于最终位置。同理,继续循环,即可得到一个排序好的数组。冒泡排序次数是数组长度-1次。
- 时间复杂度:平均情况 O(n^2);最好情况O(n);最坏情况 O(n^2)。
- 空间复杂度(辅助存储):O(1)。
- 稳定性:稳定。
2,源码
源码一:标准代码
public class ArrayBubble {
public static void main(String[] args) {
int[] arry = {21,18,36,14,48,30,65,53};
System.out.println("排序前:");
arryTraversal(arry);
System.out.println("排序后:");
arryBubble(arry);
arryTraversal(arry);
}
//遍历数组
public static void arryTraversal(int[] arry) {
String s = "";
for(int i = 0; i < arry.length; i++) {
if(i == 0) {
s = "[" + arry[i];
}else {
s += "," + arry[i];
}
}
System.out.println(s + "]");
}
//冒泡排序方法
public static void arryBubble(int[] arry) {
for(int x = 0;x < arry.length - 1;x++) { //共比较arry.length - 1次
for(int y = 0;y < arry.length - x - 1; y++) { //arry.length-x的原因:每经过一次比较后,最大索引处的元素已确定完毕,不需要再比较
if(arry[y] > arry[y+1]) { //所以-x可以降低比较次数,提高算法的效率
int temp = arry[y]; //用临时变量temp存储待交换的值
arry[y] = arry[y+1];
arry[y+1] = temp;
}
}
}
}
}
源码二:改进版(本段代码只包含冒泡排序方法本身代码,将该方法替换源码一中的“冒泡排序方法”即可使用,也可单独复制调用)
//改进后的冒泡排序方法
public static void arryBubbleNew(int[] arry) {
boolean flag = false;
for(int x = 0;x < arry.length - 1;x++) { //共比较arry.length - 1次
for(int y = 0;y < arry.length - x - 1; y++) { //arry.length-x的原因:每经过一次比较后,最大索引处的元素已确定完毕,不需要再比较
if(arry[y] > arry[y+1]) { //所以-x可以降低比较次数,提高算法的效率
int temp = arry[y]; //用临时变量temp存储待交换的值
arry[y] = arry[y+1];
arry[y+1] = temp;
flag = true;//只要顺序有发生改变的,就更改flag标志
}
}
if(flag == false) break; //如果某次循环,flag标志没有改变,
} //也就是说数组已经排好序了,不用再继续循环排序了,提高了冒泡排序的效率
}