一. 算法思想
每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作(未改进版本)。
而 “每一趟 ” 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。
二.本文介绍改进版本的冒泡排序算法,使用标志位flag表示本趟冒泡排序是否发生了元素交换,若本趟冒泡排序没有交换,说明数据已经有序,可以直接结束排序算法。
时间复杂度O(n*n)
空间复杂度O(1)
稳定性: 稳定
1.代码
package Sort;
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] a={49,38,65,97,76,13,27,49};
bubbleSort(a);
int[] b={1,2,3,4,5};
bubbleSort(b);
}
public static void bubbleSort(int[] a){
int length=a.length;
for(int i=1;i<length;i++){
boolean flag=false; //表示每趟冒泡是否发生交换的标志
for (int j=1;j<=length-i;j++){
if(a[j-1]<=a[j]){
continue;
}else {
int temp=a[j-1];
a[j-1]=a[j];
a[j]=temp;
flag=true;
}
}
System.out.println("第"+i+"趟排序后的数组为"+ Arrays.toString(a));
if(!flag){ //本趟遍历没有发生交换,说明表已经有序,排序直接结束
System.out.println("进行了"+i+"趟排序后数组有序");
break;
}
}
}
}