一、基本思路
冒泡排序的思路比较简单,为什么叫冒泡呢?它的思路就是从第一个开始,和第二个元素比较,如果比后面的元素大,则交换顺序,接着第二个和第三个比较,这样,一趟下来,数组中最大的元素就会像泡泡一样“冒”到最后的位置,第二趟,第二大的元素将会“冒”到倒数第二个位置,由此,只要经过n-1趟,数组就完成了排序。
二、例子
我们以{3,5,7,9,8,6,2,1,4,0}数组的排序为例子
第一趟:冒泡区间1~9
3 | 5 | 7 | 9 | 8 | 6 | 2 | 1 | 4 | 0 |
3 | 5 | 7 | 8 | 9 | 6 | 2 | 1 | 4 | 0 |
3 | 5 | 7 | 8 | 6 | 9 | 2 | 1 | 4 | 0 |
3 | 5 | 7 | 8 | 6 | 2 | 1 | 4 | 0 | 9 |
这一趟,9出类拔萃,跃居第一名
第二趟:冒泡区间1~8
3 | 5 | 7 | 8 | 6 | 2 | 1 | 4 | 0 | 9 |
3 | 5 | 7 | 6 | 8 | 2 | 1 | 4 | 0 | 9 |
.....
3 | 5 | 7 | 6 | 2 | 1 | 4 | 0 | 8 | 9 |
.这一趟,我们可以看到,8排到了第二名
.......
由此可见经过9趟冒泡后,数组的每个元素会在它该在的名次(位置)上,这样我们也就完成了对该数组的冒泡排序
三、代码实现
public class BubbleSort {
public void bubbleSort(int [] data){
int count=0;
int f=0;
for(int i=0;i<data.length;i++){
for(int j=0;j<data.length-i-1;j++){
if(data[j]>data[j+1]){
int temp=data[j];
data[j]=data[j+1];
data[j+1]=temp;
count++;
f=1;
}
}
if(f==0)
break;
f=0;
}
System.out.println("交换次数:"+count);
}
public static void main(String[] args) {
int [] a=new int[]{3,5,7,9,8,6,2,1,4,0};
BubbleSort bubbleSort=new BubbleSort();
bubbleSort.bubbleSort(a);
for(int item:a){
System.out.print(item+" ");
}
}
}
四、复杂度
最差和平均情况的复杂度都是O(n²),最好的情况是O(n)
为什么最好的情况是O(n)?因为在第一遍冒泡的时候发现没有交换,直接中断退出冒泡排序,
所以只做了n-1次j++,次数为T(n-1),所以时间复杂度为O(n)