排序算法大比拼 - 谁是最厉害的排序高手?¶
1. 三种排序方法大PK!¶
想象三个小朋友在比赛整理玩具,他们各自有不同的方法:
- 小泡泡(冒泡排序):
- 像气泡一样,一个一个地把大的数字往后移
- 每次都要和旁边的数字比较
-
比较慢,但是很容易理解
-
小选手(选择排序):
- 每次都找最小的数字放到前面
- 像运动会选手一样,一个一个找出第一名、第二名...
-
比冒泡快一点,因为不用经常交换位置
-
小卡片(插入排序):
- 像整理扑克牌一样,把每张新牌插到正确的位置
- 对于差不多排好序的数字特别快
- 最适合处理小数据或者已经差不多排好的数据
2. 让我们来比赛!¶
2.1. 速度比赛¶
import time
import random
def race_sorting_algorithms(numbers):
# 准备三份相同的数字
numbers1 = numbers.copy()
numbers2 = numbers.copy()
numbers3 = numbers.copy()
# 冒泡排序比赛
start_time = time.time()
bubble_sort(numbers1)
bubble_time = time.time() - start_time
# 选择排序比赛
start_time = time.time()
selection_sort(numbers2)
selection_time = time.time() - start_time
# 插入排序比赛
start_time = time.time()
insertion_sort(numbers3)
insertion_time = time.time() - start_time
print("比赛结果:")
print(f"小泡泡用时:{bubble_time:.4f}秒")
print(f"小选手用时:{selection_time:.4f}秒")
print(f"小卡片用时:{insertion_time:.4f}秒")
# 生成随机数字进行比赛
test_numbers = [random.randint(1, 100) for _ in range(1000)]
race_sorting_algorithms(test_numbers)
2.2. 不同情况下的表现¶
让我们看看在不同的比赛场地(数据情况)下,谁表现得更好:
- 随机数字:
- 小选手比较稳定
-
小泡泡和小卡片都要多花些时间
-
差不多排好序的数字:
- 小卡片特别厉害!
- 小泡泡也不错
-
小选手还是一样的速度
-
完全倒序的数字:
- 大家都要花很多时间
- 小选手最稳定
- 小泡泡和小卡片都很辛苦
3. 谁最适合什么情况?¶
3.1. 小泡泡最适合:¶
- 数字比较少的时候
- 已经差不多排好序的时候
- 需要一步一步看清楚排序过程的时候
3.2. 小选手最适合:¶
- 不想经常交换位置的时候
- 需要稳定速度的时候
- 对排序后相同数字的顺序没有要求的时候
3.3. 小卡片最适合:¶
- 一边接收数字一边排序的时候
- 处理差不多排好序的数字时
- 数字比较少的时候
4. 有趣的比较实验¶
4.1. 扑克牌游戏¶
材料:三副扑克牌 1. 三个小朋友每人拿一副牌 2. 每个人用不同的方法排序 3. 看看谁最快把牌排好!
4.2. 数字比赛¶
# 让我们来测试不同的数据类型
def test_different_cases():
# 随机数字
random_numbers = [random.randint(1, 100) for _ in range(10)]
print("\n随机数字比赛:")
race_sorting_algorithms(random_numbers)
# 差不多排好序的数字
almost_sorted = list(range(10))
almost_sorted[5], almost_sorted[6] = almost_sorted[6], almost_sorted[5]
print("\n差不多排好的数字比赛:")
race_sorting_algorithms(almost_sorted)
# 倒序的数字
reversed_numbers = list(range(10, 0, -1))
print("\n倒序数字比赛:")
race_sorting_algorithms(reversed_numbers)
# 开始比赛!
test_different_cases()
5. 小贴士¶
- 选择排序算法的建议:
- 数据量小的时候,用你最喜欢的方法
- 数据量大的时候,选择更快的算法
- 如果数据差不多排好序了,用插入排序
- 如果要一边输入一边排序,也用插入排序
-
如果要稳定的速度,用选择排序
-
有趣的发现:
- 每种排序方法都有自己的特点
- 没有哪种方法是最好的,要看具体情况
-
理解每种方法的原理比记住代码更重要
-
进阶学习:
- 试试用不同大小的数据测试
- 观察每种方法是怎么工作的
- 想想还有什么可以改进的地方
记住:选择合适的排序方法,就像选择合适的工具一样重要!每种方法都有自己的用处,关键是要知道什么时候用哪一个!