1、基本算法
public static void main(String[] args) {
int[] src = { 3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9 };
// bubbleSort1(src);
// print(src);
// bubbleSort2(src);
// print(src);
bubbleSort3(src);
print(src);
}
//基本的冒泡
public static void bubbleSort1(int src[]) {
for (int i = 0; i < src.length-1; i++) {
//将i下标的数与i下标之后的数依次比较 大了就交换
for (int j = i+1; j<src.length-1; j++) {
if(src[i] > src[j]) {
swap(src, i, j);
}
}
}
}
//正宗的冒泡
public static void bubbleSort2(int src[]) {
for (int i = 0; i < src.length-1; i++) {
//从最后开始,j与j+1进行比较,让最小的一直替换到数组的第一个
for (int j = src.length-2; j>=i; j--) {
if(src[j] > src[j+1]) {
swap(src, j, j+1);
}
}
}
}
//改进的冒泡算法
public static void bubbleSort3(int src[]) {
//设置flag
boolean flag = true;
for (int i = 0; i < src.length-1 && flag; i++) {
flag = false; //初始为false 如果比较一圈还是false 则表示没有需要替换的的元素 代表整个数组有序
for (int j = src.length-2; j>=i; j--) {
if(src[j] > src[j+1]) {
swap(src, j, j+1);
flag = true;
}
}
}
}
private static void swap(int src[], int i, int j){
int tmp = src[i];
src[i] = src[j];
src[j] = tmp;
}
public static void print(int src[]){
for (int i = 0; i < src.length; i++) {
System.out.print(src[i] + " ");
}
System.out.println();
}
2、冒泡的时间复杂度
2.1 最好的情况 如果数组有序,比较一次为O(n)
2.2 最坏的情况 如果数组逆序 需要比较(n-1)+(n-2)+…1=n/2*(n-1).复杂度为O(
n2
)