冒泡排序:最简单的排序算法,看完这篇就懂了
·
一、什么是冒泡排序?
冒泡排序(Bubble Sort)是一种基础的交换排序算法,因其排序过程中元素像水中的气泡一样逐渐 "上浮" 到正确位置而得名。
它的核心思想很简单:重复遍历要排序的数组,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。直到遍历完所有元素且没有发生交换,说明数组已经有序。
二、冒泡排序的工作原理
我们以一个无序数组 [5, 2, 9, 3, 6] 为例,一步一步看冒泡排序的过程:
-
第一趟遍历(找出最大的元素 "9" 并放到最后):
- 比较 5 和 2 → 顺序错误,交换 →
[2, 5, 9, 3, 6] - 比较 5 和 9 → 顺序正确,不交换
- 比较 9 和 3 → 顺序错误,交换 →
[2, 5, 3, 9, 6] - 比较 9 和 6 → 顺序错误,交换 →
[2, 5, 3, 6, 9]第一趟结束后,最大的元素 "9" 已 "浮" 到数组末尾。
- 比较 5 和 2 → 顺序错误,交换 →
-
第二趟遍历(找出第二大的元素 "6" 并放到倒数第二位):
- 比较 2 和 5 → 不交换
- 比较 5 和 3 → 交换 →
[2, 3, 5, 6, 9] - 比较 5 和 6 → 不交换第二趟结束后,第二大的元素 "6" 已到位(此时只需遍历前 4 个元素)。
-
第三趟遍历(无需交换,数组已有序):
- 比较 2 和 3 → 不交换
- 比较 3 和 5 → 不交换遍历结束,数组已完全有序:
[2, 3, 5, 6, 9]
三、冒泡排序的代码实现(C 语言)
下面是冒泡排序的基础实现,包含优化点(当某趟遍历没有交换时,说明数组已有序,可提前退出):
#include <stdio.h>
// 冒泡排序函数
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int swapped = 0; // 标记本趟是否发生交换
// 每趟遍历后,最大元素已到位,下一趟可少遍历一个元素
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) { // 相邻元素比较
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1; // 发生交换,标记为1
}
}
// 若本趟没有交换,说明数组已有序,直接退出
if (swapped == 0) {
break;
}
}
}
// 打印数组
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {5, 2, 9, 3, 6};
int n = sizeof(arr) / sizeof(arr[0]);
printf("排序前的数组:");
printArray(arr, n);
bubbleSort(arr, n);
printf("排序后的数组:");
printArray(arr, n);
return 0;
}
运行结果:
排序前的数组:5 2 9 3 6
排序后的数组:2 3 5 6 9
四、冒泡排序的特点分析
优点:
- 简单易懂:逻辑直观,适合新手入门排序算法。
- 稳定性好:相等元素的相对顺序在排序后不会改变(例如
[2, 5, 2]排序后仍为[2, 2, 5])。 - 原地排序:不需要额外的存储空间,空间复杂度为 O (1)。
缺点:
- 效率较低:时间复杂度为 O (n²)(最坏和平均情况),不适合处理大规模数据。
五、什么时候用冒泡排序?
冒泡排序更适合作为学习排序思想的入门案例,实际开发中很少用于处理大量数据。但在以下场景中可以考虑:
- 数据量极小(如少于 100 个元素)。
- 对排序稳定性有要求,且数据基本有序(此时优化后的冒泡排序效率接近 O (n))。
- 需要用最简单的代码实现排序功能(无需记忆复杂算法)。
总结
冒泡排序是最经典的排序算法之一,它通过重复比较相邻元素并交换来实现排序。虽然效率不高,但理解其原理能帮助我们掌握 "交换排序" 的核心思想,为学习更复杂的算法(如快速排序)打下基础。
记住:算法没有绝对的好坏,只有适合与否。冒泡排序的简单性,正是它不可替代的价值
更多推荐
所有评论(0)