什么是冒泡排序算法?
冒泡排序是一种简单的排序算法,通过多次遍历待排序的数组,逐步将最大的(或最小的)元素“冒泡”到数组的一端。它以其操作过程类似气泡从水底冒至水面而得名。
冒泡排序的工作原理
- 比较相邻元素: 从数组的第一个元素开始,逐个比较相邻的两个元素。如果前一个元素比后一个元素大(升序排序),则交换它们的位置。
- 将最大值(或最小值)移动到数组一端: 在每一轮遍历中,未排序部分的最大值(或最小值)会逐步移动到数组的末端。
- 重复以上步骤: 每次遍历的范围减小,直到整个数组有序。
代码实现
以下是冒泡排序的 Java 实现代码:
public class BubbleSort {
public static void bubbleSort(int[] arr) {
int n = arr.length;
// 外层循环表示需要进行的轮数
for (int i = 0; i < n - 1; i++) {
boolean swapped = false; // 标志位,用于优化
// 内层循环比较相邻元素
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 如果前一个元素比后一个大,交换它们
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true; // 标记发生了交换
}
}
// 如果某一轮没有发生交换,说明数组已经有序
if (!swapped) {
break;
}
}
}
public static void main(String[] args) {
int[] arr = {5, 2, 9, 1, 5, 6};
System.out.println("排序前:");
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
bubbleSort(arr);
System.out.println("排序后:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
示例运行结果
输入:arr = {5, 2, 9, 1, 5, 6}
输出:
排序前:5 2 9 1 5 6
排序后:1 2 5 5 6 9
当然,基于传统的冒泡排序算法,我们还有其一种变种,简易代码实现如下:
public static void sort(int [] data){
for (int j = 0;j < data.length-1;j++){
int m = j;
for (int k = j + 1;k < data.length;k++){
if (data[k] < data[m]){
m = k;
}
}
int temp = data[m];
int[m] = data[j];
data[j] = temp;
/*end of the loop*/
}
}
可以说,传统冒泡是像一个大泡泡从底部向上冒一样,最终是由末尾的大数向小数排,而这种变种呢跟其恰好相反,是由开头的小数向大数排。
冒泡排序的时间复杂度
-
时间复杂度:
- 最好情况(数组已排序):O(n)O(n)O(n) (优化后)。
- 最坏情况(数组逆序):O(n2)O(n^2)O(n2)。
- 平均情况:O(n2)O(n^2)O(n2)。
-
空间复杂度:
- O(1)O(1)O(1)(仅需常量级的额外空间)。
总结
冒泡排序虽然简单,但由于其效率较低,通常适用于小规模数据集或教学演示中。更高效的排序算法如快速排序或归并排序更适合实际应用场景。