算法描述:
依次比较数组中相邻两个元素大小,若 a[j] > a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后
重复以上步骤,直到整个数组有序
优化
每轮冒泡时,最后一次交换索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个数组有序,直接退出外层循环即可
举例:
int[ ] a={5,2,7,4,1,3,8,9}
第一轮冒泡结束之后: 结果为[2, 5, 4, 1, 3, 7, 8, 9]
可以看到,最后面的几个元素已经有序了,那么此时我们需要比较的就只有7前面的那些数字
代码实现
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] a={5,2,7,4,1,3,8,9};
bubble(a);
}
//冒泡排序方法
private static void bubble(int[] a) {
/*
关于比较:
一开始,需要比较a.length-1次,
每一轮的冒泡结束之后,最大的元素都会排在后面
如果后面某几个元素已经有序,则不需要比较
*/
//定义变量n,用于记录每一次元素比较的次数
int n=a.length-1;
//如果比较次数为0的话,表示这组元素已经有序了,所以while循环的结束条件是 n=0
while (true){
//last表示最后一次交换位置的索引
int last=0;
//表示每一轮的冒泡
for (int i = 0; i < n; i++) {
//如果前一个元素的值比后一个元素的值大,就交换位置
if (a[i]>a[i+1]){
swap(a,i,i+1);
//注意:此时我们用last记录下某个元素最后一次交换位置的索引
last=i;
}
}
//每一轮冒泡结束之后,记录下来的last,即某个元素最后一次交换位置的索引
// 这就是剩余元素的交换次数,因为在此之后,没有元素需要交换了
n=last;
System.out.println("冒泡结果:"+ Arrays.toString(a));
if (n==0){
break;
}
}
}
//交换两个元素位置的方法
private static void swap(int[] a,int i,int j) {
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}