普通冒泡
j 的取值(j += 1):
第一次冒泡:0~4
第二次冒泡:0~3
第三次冒泡:0~2
第三次冒泡:0~1
第五次冒泡:0
j 的上限可通过 i(从 0 ~ 数组长度的值) 和 n (数组的长度)进行控制:
第一次冒泡:4
第二次冒泡:3
第三次冒泡:2
第三次冒泡:1
第五次冒泡:0
import java.util.Arrays;
public class Sort {
public void bubbleSort(int[] data) {
int n = data.length;
for (int i = 0; i < n; i++) {
//进行两两比较
for (int j = 0; j < n - i - 1; j++) {
if (data[j] > data[j+1]) {
int tmp = data[j];
data[j] = data[j+1];
data[j+1] = tmp;
}
}
}
}
public static void main(String[] args) {
int[] data = new int[] {3, 5, 4, 1, 2, 6};
Sort a = new Sort();
a.bubbleSort(data);
int[] data2 = new int[] {1, 2, 3, 4, 5, 6};
System.out.println(Arrays.equals(data, data2));
}
}
提前退出
利用 flag 提前退出
3, 5, 4, 1, 2, 6
import java.util.Arrays;
public class Sort {
public void bubbleSort(int[] data) {
int n = data.length;
boolean flag = false;
for (int i = 0; i < n; i++) {
// 进行两两比较
for (int j = 0; j < n - i - 1; j++) {
if (data[j] > data[j + 1]) {
int tmp = data[j];
data[j] = data[j + 1];
data[j + 1] = tmp;
flag = true;
}
}
if (!flag)
break;
}
}
public static void main(String[] args) {
int[] data = new int[] { 3, 5, 4, 1, 2, 6 };
Sort a = new Sort();
a.bubbleSort(data);
int[] data2 = new int[] { 1, 2, 3, 4, 5, 6 };
System.out.println(Arrays.equals(data, data2));
}
}
时间复杂度
- 最好:O(n)
- 最坏:O(n2)
- 平均:O(n2)
空间复杂度
O(1)
稳定性
稳定: