冒泡排序完整教学课件

一、冒泡排序的基本概念

冒泡排序是一种简单的交换排序算法,它通过重复比较相邻元素,并在必要时交换位置,使较大元素逐步移动到数组末尾。

由于元素移动过程类似气泡在水中上浮,因此被称为“冒泡排序”。它适合初学者理解排序思想,也常用于算法入门教学。

基本概念:
① 相邻比较:只比较位置相邻的两个元素;
② 升序排序:希望小的元素在前面,大的元素在后面;
③ 每轮冒泡:每一轮都会把当前未排序部分的最大值推到末尾;
④ 稳定性:两个相等元素的相对位置不会改变。

二、冒泡排序的基本原理

冒泡排序的核心思想是:依次比较相邻两个元素,如果顺序不符合要求,就交换它们

例如进行升序排序时,如果左边元素大于右边元素,说明它们顺序颠倒,需要交换。经过多轮比较后,较大元素会不断向右移动,就像气泡一样“冒”到数组末尾。

每完成一轮遍历,至少会有一个元素到达它最终应在的位置。因此,后面已经排好序的元素可以不再参与比较。

三、冒泡排序的基本排序步骤

以数组 [5, 3, 8, 4, 2] 为例,演示升序排序过程。

通用规律:n 个元素最多进行 n-1 轮排序;每一轮都会确定一个最大值的最终位置。

第1轮:依次比较 5 和 3、5 和 8、5 和 4、5 和 2。较大的 5 会一路交换到末尾。

第2轮:只比较前 4 个元素,较大的 4 会移动到倒数第 2 位。

第3轮:只比较前 3 个元素,较大的 3 会移动到合适位置。

第4轮:比较前 2 个元素,确认最小元素在最前面。

四、动画演示:比较与交换

下面的动画会展示冒泡排序的完整过程。橙色表示正在比较的两个元素;即使不交换,也会先强调显示。红色表示正在交换,绿色表示已经排好序。

点击“开始排序”观看动画

五、冒泡排序的C语言代码实现

下面是 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代表本轮无交换,数组已经有序直接跳出。

六、课堂互动:C语言代码填空练习

请根据冒泡排序知识,填写下面代码中的 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; //有序优化
    }
}
参考答案:
空1:n - 1;空2:n - 1 - i;空3:>;空4:arr[j+1] = temp;空5:swapped == 0