# G4-13 课后练习 —— 冒泡排序
> **GESP等级：四级 | 考级考点：GESP Python 四级**

**姓名：__________  日期：__________**

---

>
> 🎯 **回家先念三遍口诀**：
> "冒泡冒泡，大的往后靠！相邻两两比，大数往后移！外层n-1轮，内层n-1-i次！"

---

## 一、基础练习（必做）

### 1.1 填空题

（1）冒泡排序的核心思想是：相邻两个数________，如果左边比右边大，就________。

（2）有8个数用冒泡排序，需要比较 _______ 轮。

（3）第3轮（i=2）时，需要比较 _______ 次。

（4）冒泡排序每一轮都能保证把当前最大的数"冒"到________。

（5）在Python中交换两个变量 `a` 和 `b` 的写法是：`___ , ___ = ___ , ___`。

### 1.2 选择题

**（1）冒泡排序中，如果有n个数，外循环需要执行多少次？**
- A. n次
- B. n-1次
- C. n+1次
- D. n/2次

**（2）下面哪一组是冒泡排序第1轮后的结果？（原始：[7, 2, 9, 4]）**
- A. [2, 7, 4, 9]
- B. [2, 7, 9, 4]
- C. [9, 7, 4, 2]
- D. [2, 4, 7, 9]

**（3）冒泡排序中，内循环的j最大能取到多少？**
- A. n-1
- B. n-2
- C. n-1-i
- D. n-2-i

**（4）下列哪种情况最适合用冒泡排序？**
- A. 数据已经基本排好，只有少量无序
- B. 数据完全随机
- C. 数据非常大（几百万个）
- D. 数据是字符串

### 1.3 排序模拟题

用冒泡排序给 `[9, 4, 7, 2, 5]` 排序，写出完整过程。

**第1轮**：

| 比较 | 操作 | 当前数组 |
|------|------|----------|
| 9 vs 4 | | [___, ___, ___, ___, ___] |
| ___ vs ___ | | [___, ___, ___, ___, ___] |
| ___ vs ___ | | [___, ___, ___, ___, ___] |
| ___ vs ___ | | [___, ___, ___, ___, ___] |

**第2轮**：

| 比较 | 操作 | 当前数组 |
|------|------|----------|
| ___ vs ___ | | [___, ___, ___, ___, ___] |
| ___ vs ___ | | [___, ___, ___, ___, ___] |
| ___ vs ___ | | [___, ___, ___, ___, ___] |

**第3轮**：

| 比较 | 操作 | 当前数组 |
|------|------|----------|
| ___ vs ___ | | [___, ___, ___, ___, ___] |
| ___ vs ___ | | [___, ___, ___, ___, ___] |

**第4轮**：

| 比较 | 操作 | 当前数组 |
|------|------|----------|
| ___ vs ___ | | [___, ___, ___, ___, ___] |

**最终结果**：________________

---

## 二、编程练习（必做）

### 2.1 写一个冒泡排序函数

打开Python编辑器，自己写一个冒泡排序函数，要求：

```python
def my_bubble_sort(arr):
    # 在这里写你的代码
    # 提示：用双重循环
    pass

# 测试代码
test_data = [8, 3, 6, 1, 9, 2]
print("排序前：", test_data)
result = my_bubble_sort(test_data)
print("排序后：", result)
```

**写完后的思考**：
- 你的代码输出了什么？跟预期一样吗？
- 如果改成从大到小排序，需要改哪里？

### 2.2 修改排序动画代码

打开课堂上的 `01_冒泡排序.py` 文件，做以下修改：

1. **修改数据**：把DATA改成 `[10, 3, 7, 1, 8, 4, 6, 2, 9, 5]`
2. **修改速度**：把SPEED改成0.1，看看快速排序是什么样子
3. **修改颜色**：把柱子颜色改成你喜欢的颜色
4. **运行观察**：观察10个数的冒泡排序需要多少轮、多少次比较

---

## 三、进阶练习（选做）

### 3.1 优化冒泡排序

课堂上学过：如果某一轮没有发生任何交换，说明已经排好了，可以提前结束。

请实现这个"优化版冒泡排序"：

```python
def optimized_bubble_sort(arr):
    n = len(arr)
    for i in range(n-1):
        swapped = ______  # 标记有没有交换
        for j in range(n-1-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                ______ = True  # 发生交换
        if not swapped:  # 如果没交换
            ______  # 提前结束
    return arr
```

**测试**：用 `[1, 2, 3, 4, 5]`（已经排好的）来测试，看看优化版少做了多少轮比较。

### 3.2 冒泡排序的变种

**双向冒泡排序（鸡尾酒排序）**：
普通的冒泡排序只从前往后冒，双向冒泡排序从前往后冒一次，再从后往前冒一次。

研究一下这个算法，试试能不能写出来。

提示：
- 先从前往后，把大的冒到最后
- 再从后往前，把小的冒到最前
- 重复直到排好

### 3.3 生活中的排序

找一找生活中的"冒泡排序"：

| 场景 | 描述 | 像冒泡排序的哪一步？ |
|------|------|---------------------|
| 排队买票 | 高个子不自觉往后站 | 相邻比较，大的往后 |
| 整理书本 | 按大小排列 | |
| 体育课排队 | 按身高排队 | |
| 你的发现 | ________________ | ________________ |

至少写3个生活中的排序例子。

---

## 四、挑战题（超级选做）

### 4.1 用冒泡排序排字符串

冒泡排序不仅能排数字，还能排字符串哦！

```python
words = ["banana", "apple", "cherry", "date", "elderberry"]
# 用冒泡排序把它们按字母顺序排好
```

提示：字符串比较大小用 `>` 和 `<` 就可以了。

### 4.2 猴子排序vs冒泡排序

查一查什么是"猴子排序"（Bogo Sort），跟冒泡排序对比：

| 对比项 | 冒泡排序 | 猴子排序 |
|--------|----------|----------|
| 思想 | | |
| 速度 | | |
| 靠谱吗？ | | |

---


> 孩子完成了以上练习（请家长在完成的项目前打√）：
>
> □ 基础练习（1.1~1.3）
> □ 编程练习（2.1~2.2）
> □ 进阶练习（3.1~3.3）
> □ 挑战题（4.1~4.2）
>
>
> 孩子的话：今天学了冒泡排序，我觉得_________________________
>
> _______________________________________________________

---

---

**自我评价：** □ 全都会了  □ 大部分会了  □ 还要再练练