小白向-用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]


总结

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

相关推荐
xyliiiiiL1 小时前
ZGC初步了解
java·jvm·算法
爱的叹息2 小时前
RedisTemplate 的 6 个可配置序列化器属性对比
算法·哈希算法
独好紫罗兰2 小时前
洛谷题单2-P5713 【深基3.例5】洛谷团队系统-python-流程图重构
开发语言·python·算法
每次的天空3 小时前
Android学习总结之算法篇四(字符串)
android·学习·算法
请来次降维打击!!!4 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
qystca4 小时前
蓝桥云客 刷题统计
算法·模拟
别NULL4 小时前
机试题——统计最少媒体包发送源个数
c++·算法·媒体
weisian1514 小时前
Java常用工具算法-3--加密算法2--非对称加密算法(RSA常用,ECC,DSA)
java·开发语言·算法
程序员黄同学6 小时前
贪心算法,其优缺点是什么?
算法·贪心算法
仙人掌_lz6 小时前
机器学习ML极简指南
人工智能·python·算法·机器学习·面试·强化学习