排序算法之冒泡排序
本文主要介绍冒泡排序的原理及其代码实现
冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一 个元素移动到它应该在的位置,重复n次,就完成了n个数据的排序工作
首先,来看一组数据4,5,6,3,2,1,从小到大进行排序,第一趟冒泡的结果如下图所示:
从上图可以知道,每趟冒泡都是在执行如下操作:判断和交换.这两个操作想必大家都很熟悉了.代码实现如下:
for(int j=0;j<n-1;j++)
if (a[j] > a[j+1]) { // 交换,左边的数大于右边就交换,因此这是升序
int tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
} //这是冒泡排序的核心代码
当第一趟冒泡结束之后,将本趟冒泡产生的最大数或者最小数放置到数组的末端,同时它将不在参与下一次排序.例如:第一趟排序之后,6是数组中最大的数,将6赋值给a[5],a[5]便变成了a[0]~a[5]中最大的数,a[5]就不用在参与后面的排序了;第二趟排序之后,将5赋值给a[4],a[4]便变成了a[0]~a[4]中最大的数,a[4]也不用在参与后面的排序,以此类推.一共需要进行n趟才能将数组排序完毕,例如:上述数组a的长度n=6,经历了6趟.代码实现如下:
public void bubbleSort(int a[],int n){
if(n<=1) return;
for(int i=0;i<n;i++){//其实i<n-1也是可以的,因为当i=n-1时,j<0,内层循环不符合条件
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){//交换
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
}
冒泡排序的优化
当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。
代码实现如下:
public void bubbleSort(int a[],int n){
if(n<=1) return;
for(int i=0;i<n;i++){
//提前退出冒泡循环的标志位
boolean flag=false;
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){//交换
int tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
flag=true;//表示有数据交换
}
}
if(!flag)break;//没有数据交换提前退出
}
}