前言
冒泡算法的效率很低,但实现简单,适合作为入门的算法
1.基本思想
对当前的为排列好序的范围内的数进行排序,通过对比临近的两个数的大小进行比较调整;让大的数进行下沉,小的数进行上浮。既是:当每两个数比较后发现他们的排序与排序的要求相反时,将它们进行交换。每次遍历都可确定一个最大值放到待排序数组的末尾,下次遍历,对该最大值以及它之后的元素不再排序。
2.实例
public class Sort {
private int[] array;
public Sort(int[] array) {
this.array = array;
}
//排序打印格式
public void display(){
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+"\t");
}
System.out.println();
}
//冒泡排序
public void bubbleSort(){
int temp;
int len = array.length;
for (int i = 0; i < len-1; i++) {
for (int j = 1; j < len-i; j++) {
if (array[j-1]>array[j]) {
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
System.out.print("第" + (i + 1) + "轮排序结果:");
display();
}
}
//测试方法
public static void main(String[] args) {
int[] a = {3,6,4,2,11,10,5};
Sort sort = new Sort(a);
System.out.print("未排序时的结果:");
sort.display();
sort.bubbleSort();
}
}
3.结果打印:
5.冒泡算法的改进
在上面可以看出第四轮结束后,该序列已经排序完成,对于最后两轮来说这是没有必要的。
对此,最简单改进方法是加入一标志性变量exchange,用于标志某一趟排序中是否由数据进行交换,如果没有数据进行交换则立即结束排序,避免不必要的过程。
public void bubbleSort_improvement(){
int temp;
int len = array.length;
for (int i = 0; i < len-1; i++) {
boolean exchange = false; //设置标志性变量
for (int j = 1; j < len-i; j++) {
if (array[j-1]>array[j]) {
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
if (!exchange){
exchange = true;
}
}
}
if (!exchange){
break;
}
System.out.print("第" + (i + 1) + "轮排序结果:");
display();
}
}