冒泡排序是一种简单的交换排序算法,它通过重复比较相邻元素,并在必要时交换位置,使较大元素逐步移动到数组末尾。
由于元素移动过程类似气泡在水中上浮,因此被称为“冒泡排序”。它适合初学者理解排序思想,也常用于算法入门教学。
冒泡排序的核心思想是:依次比较相邻两个元素,如果顺序不符合要求,就交换它们。
例如进行升序排序时,如果左边元素大于右边元素,说明它们顺序颠倒,需要交换。经过多轮比较后,较大元素会不断向右移动,就像气泡一样“冒”到数组末尾。
每完成一轮遍历,至少会有一个元素到达它最终应在的位置。因此,后面已经排好序的元素可以不再参与比较。
以数组 [5, 3, 8, 4, 2] 为例,演示升序排序过程。
第1轮:依次比较 5 和 3、5 和 8、5 和 4、5 和 2。较大的 5 会一路交换到末尾。
第2轮:只比较前 4 个元素,较大的 4 会移动到倒数第 2 位。
第3轮:只比较前 3 个元素,较大的 3 会移动到合适位置。
第4轮:比较前 2 个元素,确认最小元素在最前面。
下面的动画会展示冒泡排序的完整过程。橙色表示正在比较的两个元素;即使不交换,也会先强调显示。红色表示正在交换,绿色表示已经排好序。
下面是 C 语言版本的冒泡排序实现。外层循环控制排序轮数,内层循环控制相邻元素比较。
#include <stdio.h>
// 冒泡排序函数
void bubble_sort(int arr[], int n)
{
int i, j;
int swapped;
// 外层循环:最多 n-1 轮
for(i = 0; i < n - 1; i++)
{
swapped = 0;
// 内层循环:相邻元素比较
for(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 = 1;
}
}
// 如果本轮没有交换,说明已有序
if(swapped == 0)
break;
}
}
int main(void)
{
int arr[] = {5, 3, 8, 4, 2};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
// 输出排序结果
for(int k = 0; k < n; k++)
{
printf("%d ", arr[k]);
}
return 0;
}
void bubble_sort(int arr[], int n):数组与数组长度传入函数;i < n - 1:最多进行 n‑1 轮冒泡;j < n‑1‑i:末尾 i 个元素已经有序,不再参与比较;if(arr[j] > arr[j+1]):相邻逆序,借助临时变量temp交换;swapped优化标记,0代表本轮无交换,数组已经有序直接跳出。
请根据冒泡排序知识,填写下面代码中的 5 个空。填写完成后点击“提交答案”进行检查。
void bubble_sort(int arr[], int n)
{
int i,j;
int swapped;
for(i = 0; i < ; ) //最多n‑1轮
{
swapped = 0;
for(j = 0; j < ; ) //每轮比较范围
{
if(arr[j] arr[j+1]) //相邻比较条件
{
int temp = arr[j];
arr[j] = arr[j+1];
; //完成交换
swapped = 1;
}
}
if() break; //有序优化
}
}
n - 1;空2:n - 1 - i;空3:>;空4:arr[j+1] = temp;空5:swapped == 0