什么是选择排序?

选择排序是一种简单直观的排序算法,它的核心思想是每次从待排序的元素中找出最小(或最大)的元素,然后将其放到已排序部分的末尾,直到所有元素都排好序。想象一下整理一叠打乱的扑克牌:你会从牌堆中一张一张挑出最小的牌,按顺序放在桌子的左边,直到所有牌都排好序。

选择排序的步骤

  1. 初始化:假设数组的第一个元素是当前最小的元素(即位置0为已排序部分的末尾)。
  2. 遍历寻找最小值:从当前未排序部分的下一个元素开始,遍历整个未排序区域,找到比当前最小值更小的元素,更新最小值的位置。
  3. 交换位置:将找到的最小值与当前未排序部分的第一个元素交换位置,此时该元素就被“固定”在已排序部分的末尾。
  4. 重复操作:重复上述步骤,直到未排序部分为空(即所有元素都已排好序)。

Python代码实现

下面是选择排序的Python实现,代码中包含详细注释,方便理解每一步:

def selection_sort(arr):
    # 获取数组长度
    n = len(arr)
    # 外层循环:控制需要排序的元素范围(从0到n-2,因为最后一个元素无需排序)
    for i in range(n - 1):
        # 假设当前位置i的元素是最小值
        min_index = i
        # 内层循环:从i+1到n-1寻找更小的元素
        for j in range(i + 1, n):
            # 如果找到更小的元素,更新最小值的位置
            if arr[j] < arr[min_index]:
                min_index = j
        # 交换当前位置i的元素与找到的最小值元素
        arr[i], arr[min_index] = arr[min_index], arr[i]
    return arr

# 测试代码
if __name__ == "__main__":
    # 未排序的数组
    unsorted = [64, 25, 12, 22, 11]
    print("排序前:", unsorted)
    # 调用选择排序函数
    sorted_arr = selection_sort(unsorted)
    print("排序后:", sorted_arr)

代码解释

  • 外层循环:变量i从0到n-2range(n-1)),表示已排序部分的末尾位置。每次循环结束后,arr[i]会被固定为已排序部分的第i个元素(即最小值)。
  • 内层循环:变量ji+1n-1,遍历未排序部分的所有元素,找到最小元素的位置min_index
  • 交换操作:找到最小值后,通过arr[i], arr[min_index] = arr[min_index], arr[i]交换元素,确保最小值被“放到”已排序部分的末尾。

运行结果

运行上述测试代码,输出如下:

排序前: [64, 25, 12, 22, 11]
排序后: [11, 12, 22, 25, 64]

复杂度分析

  • 时间复杂度:无论输入数据如何,选择排序都需要进行两层循环(外层n次,内层n次),因此时间复杂度为O(n²)(n为数组长度)。
  • 空间复杂度:选择排序是原地排序算法,不需要额外的数组空间,因此空间复杂度为O(1)

选择排序的特点

  • 简单直观:逻辑清晰,容易理解和实现,适合初学者学习排序算法的基本思想。
  • 不稳定排序:如果数组中有相同元素,交换过程可能导致它们的相对顺序改变(例如数组[2, 2, 1]排序后可能变成[1, 2, 2],但原数组中第一个2可能和第二个2的顺序被交换)。
  • 原地排序:不需要额外空间,仅通过交换元素完成排序。

选择排序虽然时间复杂度较高,但在小规模数据排序中仍有实用价值,尤其适合理解排序算法的基本思想。通过上述步骤和代码,你已经掌握了如何用Python实现选择排序!

小夜