跳转至

排序算法大比拼 - 谁是最厉害的排序高手?

1. 三种排序方法大PK!

想象三个小朋友在比赛整理玩具,他们各自有不同的方法:

  1. 小泡泡(冒泡排序)
  2. 像气泡一样,一个一个地把大的数字往后移
  3. 每次都要和旁边的数字比较
  4. 比较慢,但是很容易理解

  5. 小选手(选择排序)

  6. 每次都找最小的数字放到前面
  7. 像运动会选手一样,一个一个找出第一名、第二名...
  8. 比冒泡快一点,因为不用经常交换位置

  9. 小卡片(插入排序)

  10. 像整理扑克牌一样,把每张新牌插到正确的位置
  11. 对于差不多排好序的数字特别快
  12. 最适合处理小数据或者已经差不多排好的数据

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. 不同情况下的表现

让我们看看在不同的比赛场地(数据情况)下,谁表现得更好:

  1. 随机数字
  2. 小选手比较稳定
  3. 小泡泡和小卡片都要多花些时间

  4. 差不多排好序的数字

  5. 小卡片特别厉害!
  6. 小泡泡也不错
  7. 小选手还是一样的速度

  8. 完全倒序的数字

  9. 大家都要花很多时间
  10. 小选手最稳定
  11. 小泡泡和小卡片都很辛苦

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. 小贴士

  1. 选择排序算法的建议
  2. 数据量小的时候,用你最喜欢的方法
  3. 数据量大的时候,选择更快的算法
  4. 如果数据差不多排好序了,用插入排序
  5. 如果要一边输入一边排序,也用插入排序
  6. 如果要稳定的速度,用选择排序

  7. 有趣的发现

  8. 每种排序方法都有自己的特点
  9. 没有哪种方法是最好的,要看具体情况
  10. 理解每种方法的原理比记住代码更重要

  11. 进阶学习

  12. 试试用不同大小的数据测试
  13. 观察每种方法是怎么工作的
  14. 想想还有什么可以改进的地方

记住:选择合适的排序方法,就像选择合适的工具一样重要!每种方法都有自己的用处,关键是要知道什么时候用哪一个!

进一步学习