跳转至

Python选择排序 - 找到最小的放在前面!

视频教程

1. 选择排序基础概念

2. 完整排序过程

3. 代码讲解

1. 选择排序是什么?让我们一起想象...

想象你在玩一个找小朋友的游戏!每次从一群小朋友中找出最矮的,让他站到队伍的最前面。然后再从剩下的小朋友中找出最矮的,让他站到第二个位置。就这样一直找下去,直到所有小朋友都排好队啦!

在这里看看小朋友是怎么排队的!

2. 让我们玩个游戏!

2.1. 找最小的游戏

想象你有一堆积木,每个积木上都写着数字: 1. 先找出最小的数字,放到第一个位置 2. 再从剩下的数字中找最小的,放到第二个位置 3. 一直这样找下去,直到所有数字都排好啦!

2.2. 写个简单的程序

def selection_sort(numbers):
    # 遍历所有数字
    for i in range(len(numbers)):
        # 假设当前位置的数字最小
        smallest_position = i

        # 在剩下的数字中找真正的最小值
        for j in range(i + 1, len(numbers)):
            if numbers[j] < numbers[smallest_position]:
                smallest_position = j

        # 把最小的数字放到当前位置
        numbers[i], numbers[smallest_position] = numbers[smallest_position], numbers[i]

    return numbers

# 试一试!
my_numbers = [5, 2, 8, 1, 9]
print("排序前:", my_numbers)
sorted_numbers = selection_sort(my_numbers)
print("排序后:", sorted_numbers)

3. 让选择排序变得更有趣!

3.1. 找最大最小值

就像玩跷跷板一样,我们可以同时找最高和最矮的小朋友:

def fun_selection_sort(numbers):
    left = 0
    right = len(numbers) - 1

    while left < right:
        # 找最小和最大的数字
        min_pos = left
        max_pos = left

        for i in range(left, right + 1):
            if numbers[i] < numbers[min_pos]:
                min_pos = i
            if numbers[i] > numbers[max_pos]:
                max_pos = i

        # 把最小的放左边
        numbers[left], numbers[min_pos] = numbers[min_pos], numbers[left]

        # 如果最大的数在left位置,现在它被移动到了min_pos位置
        if max_pos == left:
            max_pos = min_pos

        # 把最大的放右边
        numbers[right], numbers[max_pos] = numbers[max_pos], numbers[right]

        left += 1
        right -= 1

    return numbers

# 试试这个有趣的方法
my_numbers = [6, 2, 9, 1, 7, 3, 8]
print("排序前:", my_numbers)
sorted_numbers = fun_selection_sort(my_numbers)
print("排序后:", sorted_numbers)

4. 选择排序有什么特点?

4.1. 优点:

  • 超级容易理解,就像找最矮的小朋友一样简单!
  • 不用经常交换位置,比冒泡排序快一些
  • 写起来很简单,代码很清楚
  • 特别适合小朋友学习编程

4.2. 缺点:

  • 如果数字特别多,找最小值会比较慢
  • 每次都要看完所有剩下的数字
  • 不适合处理特别大的数据

5. 生活中的例子

5.1. 整理玩具

想象你在整理一堆玩具小车: 1. 先找出最小的小车,放到第一个 2. 再找剩下的最小的,放到第二个 3. 这样一直找下去,直到所有小车都按大小排好啦!

5.2. 运动会排名

  1. 找出跑得最快的同学,给第一名
  2. 在剩下的同学中找最快的,给第二名
  3. 这样一直找下去,直到所有名次都排好啦!

6. 趣味练习题

6.1. 小游戏:找最小的数字

材料:5张卡片,每张写一个不同的数字 1. 把卡片随机排列 2. 试着用选择排序的方法把它们排好 3. 数一数你找了多少次最小的数?

6.2. 动手编程

# 完成下面的程序,实现选择排序
def my_first_selection_sort(numbers):
    # 在这里写下你的代码
    # 提示:需要两个for循环
    # 提示:第一个循环决定当前位置
    # 提示:第二个循环找最小的数
    pass

# 测试你的程序
test_numbers = [4, 2, 7, 1, 3]
sorted_numbers = my_first_selection_sort(test_numbers)
print("你的程序排序结果:", sorted_numbers)

7. 小贴士

  1. 记住选择排序的关键点
  2. 每次都找最小的数字
  3. 找到后放到正确的位置
  4. 不断缩小寻找范围

  5. 练习方法

  6. 用积木或卡片实际操作一遍
  7. 画图表示每一步的变化
  8. 和小伙伴一起演示排序过程

  9. 进阶学习

  10. 试试同时找最大和最小的数
  11. 比较和冒泡排序的不同
  12. 想想还有什么可以优化的地方

记住:选择排序就像找小朋友排队一样简单,慢慢练习就能掌握啦!

进一步学习


选择排序 (Selection Sort)

算法介绍

选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

完整演示

下面的视频展示了选择排序的完整过程:

代码实现

让我们来看看选择排序的Python代码实现:

def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        # 找到未排序部分中最小元素的索引
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        # 将找到的最小元素放到已排序序列的末尾
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr

算法特点

  1. 时间复杂度:O(n²)
  2. 空间复杂度:O(1)
  3. 稳定性:不稳定
  4. 原地排序:是

适用场景

  1. 数据量较小
  2. 对稳定性没有要求
  3. 需要最小化交换操作的次数