冒泡排序(Bubble Sort)
冒泡排序是一种比较简单的排序算法,是较基础的比较类交换排序,也是一种稳定排序算法。每个元素都可以看成一个“小气泡”,通过根据自身大小一点一点的移动到数列的顶端(升序或降序排列)达到排序的效果。
算法原理:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这样情况下,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复步骤1~3,直到没有任何一对数字需要比较(排序完成)。
注:实质上就是依次比较相邻元素的大小,“升序”就是把小(大)的元素往前(后)调,“降序”就是把小(大)的元素往后(前)调。
例子引入:假设待排序序列为:[ 9 , 1 , 5 , 3 , 7 ],若采用冒泡排序对其进行升序(由小到大)排序,排序过程如下所示:
核心代码实现如下:
public void bubbleSort(int[] arr){ //例子中[9,1,5,3,7]
for(int j = 0; j < arr.length-1; j++){
for(int i = 0; i < arr.length-1-j; i++){
System.out.print("比较"+ (i+1) +"次:"+ arr[i] +","+ arr[i+1]+";");
if(arr[i] > arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println("==>第"+ (j+1) +"趟排序(j="+j+"):"+ Arrays.toString(arr));
}
System.out.println("==>冒泡排序完成后结果为"+ Arrays.toString(arr));
}
/*输出结果为:
* 比较1次:9,1;比较2次:9,5;比较3次:9,3;比较4次:9,7;==>第1趟排序(j=0):[1, 5, 3, 7, 9]
* 比较1次:1,5;比较2次:5,3;比较3次:5,7;==>第2趟排序(j=1):[1, 3, 5, 7, 9]
* 比较1次:1,3;比较2次:3,5;==>第3趟排序(j=2):[1, 3, 5, 7, 9]
* 比较1次:1,3;==>第4趟排序(j=3):[1, 3, 5, 7, 9]
* ==>冒泡排序完成后结果为[1, 3, 5, 7, 9]
*/
注意:在上述代码结果中,我们可以看出,其实在第2趟的时候就已经完成了排序,但是代码并不知道排序已经完成,还是会继续执行下一趟排序。这时,我们可以进行优化,设置一个标志位flag进行判别。
首先,在每一趟开始之前,初始化flag的值为false,如果两个元素比较后需要交换时,就将flag更改为true。所以某一趟情况下,如果发生交换,则flag=true,程序会顺利进入下一趟排序。但是如果没有发生交换,flag的值仍为false,即flag=false证明本趟已排序完成,即可return跳出循环。
代码优化如下:
public void bubbleSort(int[] arr){ //例子中[9,1,5,3,7]
for(int j = 0; j < arr.length-1; j++){
flag=false;//标志位初值为false
for(int i = 0; i < arr.length-1-j; i++){
if(arr[i] > arr[i+1]){
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
flag=true;//当发生交换,修改为true
}
}
System.out.println("==>第"+ (j+1) +"趟排序(j="+j+"):"+ Arrays.toString(arr));
if(!flag){//一趟排序后flag值仍为false
System.out.println("==>冒泡排序完成后结果为"+ Arrays.toString(arr));
return;
}
}
System.out.println("==>冒泡排序完成后结果为"+ Arrays.toString(arr));
}
/*输出结果为:
* ==>第1趟排序(j=0):[1, 5, 3, 7, 9]
* ==>第2趟排序(j=1):[1, 3, 5, 7, 9]
* ==>第3趟排序(j=2):[1, 3, 5, 7, 9]
* ==>冒泡排序完成后结果为[1, 3, 5, 7, 9]
* */