小白向-用python实现选择排序

一、选择排序的定义

选择排序(Selection Sort)是一种不稳定原地比较排序,它的核心思想是每轮遍历选择最小(或最大)元素放入合适位置,最终完成排序。该算法适用于小规模数据排序,尤其是在对数据稳定性要求不高的场景中。


二、选择排序的发展历史

选择排序最早由计算机科学家提出,作为最基本的排序算法之一,它在计算机科学教育中被广泛用于教学。虽然在实际应用中不如快速排序等高效算法常用,但其直观的选择过程使其成为算法学习的基础。


三、选择排序的排序过程

选择排序的基本步骤如下:

  1. 遍历数组,找到最小元素:从数组未排序部分选出最小(或最大)元素;
  2. 交换元素:将最小(或最大)元素与当前遍历的起始位置元素进行交换;
  3. 重复上述步骤:逐轮确定一个最小值,并放置在正确的位置,直到整个数组有序。

例如,对 [64, 25, 12, 22, 11] 进行升序排序:

python 复制代码
初始数组:[64, 25, 12, 22, 11]
第一轮: 选择 11,交换后 [11, 25, 12, 22, 64]
第二轮: 选择 12,交换后 [11, 12, 25, 22, 64]
第三轮: 选择 22,交换后 [11, 12, 22, 25, 64]
第四轮: 选择 25,交换后 [11, 12, 22, 25, 64]
最终结果:[11, 12, 22, 25, 64]

可以看到,每轮都找到了最小元素,并将其交换到正确的位置。


四、选择排序的基本原理

选择排序的核心思想是不断选择未排序部分的最小值 ,并与当前轮次的起始元素进行交换。

其原理可以概括如下:

  1. 假设前 i 个元素已排序 ,从未排序的 n - i 个元素中找到最小值;
  2. 将最小值放在第 i ,确保前 i + 1 个元素已经排序;
  3. 重复 n-1,最终数组有序。

该算法的时间复杂度为 O(n²) ,空间复杂度为 O(1),因为它只使用了少量额外的变量。


五、选择排序的特点

  1. 不稳定:当某个最小元素被交换时,可能会改变相等元素的相对顺序。
  2. 时间复杂度恒定 :无论初始数据是否有序,选择排序始终执行 O(n²) 级别的比较操作。
  3. 空间占用小:不需要额外的辅助存储空间,仅使用常数级别的辅助变量。

六、选择排序的优点

  1. 交换次数少:相比冒泡排序,选择排序的交换次数较少,每轮最多一次交换,提高了效率;
  2. 适用于小规模数据排序:在数据量较小时,仍然可以较快完成排序;
  3. 不依赖数据初始状态:无论数据是否有序,选择排序的执行流程一致。

七、选择排序的缺点

  1. 时间复杂度高 :无论数据是否已部分有序,选择排序始终需要 O(n²) 次比较;
  2. 不稳定:如果相同元素被交换,可能会打乱其原始相对顺序;
  3. 不适用于大规模数据 :在数据量较大时,选择排序的效率较低,不如快速排序归并排序等高效算法。

Python 代码实现

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

# 测试
print(selection_sort([64, 25, 12, 22, 11]))

代码解析

  • 外层循环 (for i in range(n)):遍历整个数组,确定当前位置的元素;
  • 内层循环 (for j in range(i+1, n)):从未排序部分找最小值;
  • min_idx = j:更新最小值的索引;
  • arr[i], arr[min_idx] = arr[min_idx], arr[i]:找到最小值后进行交换。

代码运行结果

[11, 12, 22, 25, 64]


总结

选择排序通过不断寻找最小元素并交换位置,实现数组的排序。虽然它具有较好的直观性,但由于其时间复杂度较高,不适合大规模数据处理。它的优势在于较少的交换次数 ,但劣势是不稳定且对已排序数组没有优化。

相关推荐
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing3 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21123 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP4 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN4 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218314 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤5 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate5 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran6 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹6 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统