python-选择排序

选择排序 是一种简单直观的排序算法,它的基本思想是每一轮选择未排序部分的最小元素,然后将其放到已排序部分的末尾。这个过程持续进行,直到整个数组排序完成。(重点:通过位置找元素)

以下是选择排序的详细步骤和 Python 实现:

选择排序 包括以下几个关键步骤:

  1. 初始状态: 将整个数组划分为已排序部分和未排序部分。初始时,已排序部分为空,未排序部分包含整个数组。

  2. 选择最小元素: 在未排序部分中找到最小的元素,并记录其索引。遍历未排序部分的元素,找到其中最小的元素。

  3. 交换位置: 将最小元素与未排序部分的第一个元素交换位置。通过交换,将最小元素放到已排序部分的末尾,同时将未排序部分的起始位置向右移动一个元素。

  4. 迭代: 重复执行步骤 2 和步骤 3,直到未排序部分为空。每一轮迭代都会选择未排序部分的最小元素,将其放到已排序部分的末尾。

  5. 排序完成: 当未排序部分为空时,整个数组排序完成。已排序部分包含整个数组,按顺序排列。

以下是选择排序的要点总结:

  • 不稳定性: 选择排序是一种不稳定的排序算法,相等元素的相对位置可能会改变。

  • 时间复杂度: 选择排序的时间复杂度为 O(n^2),其中 n 是数组的长度。这是因为每一轮都需要在未排序部分找到最小元素,而总共有 n-1 轮。

  • 空间复杂度: 选择排序的空间复杂度为 O(1),因为它只需要常数级的额外空间用于记录最小元素的索引。

  • 简单实现: 选择排序的实现相对简单,适用于对规模较小的数据集进行排序。然而,在大规模数据集上,性能相对较差,更高效的排序算法如快速排序和归并排序通常更为合适。

Python 实现选择排序:

python 复制代码
def selection_sort(arr):
    n = len(arr)

    # 遍历整个数组
    for i in range(n):
        # 假设当前位置的元素为最小值
        min_index = i

        # 在未排序部分找到最小元素的索引
        for j in range(i + 1, n):
            if arr[j] < arr[min_index]:
                min_index = j

        # 将最小元素与未排序部分的第一个元素交换位置
        arr[i], arr[min_index] = arr[min_index], arr[i]

# 示例
arr = [64, 25, 12, 22, 11]
selection_sort(arr)
print("排序后的数组:", arr)

在这个示例中,selection_sort 函数实现了选择排序算法。它通过两层嵌套的循环,在每一轮外层循环中选择未排序部分的最小元素,并将其放到已排序部分的末尾。最后,输出排序后的数组。

个人示例:

python 复制代码
"""选择排序  位置来找元素"""
sortList = [2,1,5,3,5,6,8]
for i in range(0,len(sortList)-1):
    """通过定义一个变量index 来记录 此时需排序的位置"""
    index=i
    for j in range(i+1,len(sortList)):  #
        if sortList[index] > sortList[j]:
            # 代码块内容
            index=j
    """循环结束 让最小的元素与相应位置上的元素进行交换"""
    sortList[index],sortList[i]=sortList[i],sortList[index]
print(sortList)

这段代码实现了选择排序的算法。以下是关键点的介绍:

外层循环 (for i in range(0, len(sortList) - 1)): 这是选择排序的外层循环,负责遍历整个数组。i 表示已排序部分的末尾位置,初始时为 0。

内层循环 (for j in range(i + 1, len(sortList))): 这是选择排序的内层循环 ,在未排序部分中查找最小元素。j 表示未排序部分的当前位置。对于 for j in range(i+1, len(sortList)) 中的 len(sortList),这表示整个数组的长度 ,而不是 len(sortList-1)。在编程中,数组的索引是从0开始的,所以数组的最后一个元素的索引是 len(sortList) - 1,而不是 len(sortList)。因此,在排序算法中,通常使用 len(sortList) 来表示数组的长度 。在具体的排序算法中,for j in range(i+1, len(sortList)) 的目的是遍历数组中从索引 i+1 到数组末尾的所有元素,这正是未排序部分的元素。由于 Python 中 range 函数是左闭右开区间,所以 range(i+1, len(sortList)) 会遍历从 i+1 到 len(sortList)-1 的索引。

如果使用 len(sortList-1),则会导致遍历的结束位置是 len(sortList-1)-1,这与我们的预期不符,因为我们希望遍历到数组的最后一个元素。因此,正确的写法是使用 len(sortList)。

查找最小元素: 通过比较 sortListindex 和 sortListj 的大小,如果找到更小的元素,更新 index。

交换位置 (sortListindex, sortListi = sortListi, sortListindex): 内层循环结束后,将找到的最小元素与已排序部分的末尾元素进行交换。

循环结束后输出排序后的数组 (print(sortList)): 外层循环执行完成后,整个数组就完成了排序。

总体来说,选择排序的核心思想是在未排序部分中选择最小的元素,然后与已排序部分的末尾元素交换,逐步完成排序。

选择排序的时间复杂度为 O(n^2),空间复杂度为 O(1)。尽管选择排序的性能相对较差,但它的实现简单,适用于较小规模的数据集。

相关推荐
吞下星星的少年·-·9 分钟前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang202444 分钟前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
荣码1 小时前
长上下文与大文档处理:200页PDF怎么喂给AI,我踩了4个坑
java·python
二本咕咕-机械转码1 小时前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-1 小时前
两数之和-C++实现
c++·算法
j7~1 小时前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号2 小时前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯
databook2 小时前
Pandas 与 Polars:语法、性能和资源占用方面的对比
python·数据分析·pandas
威哥爱编程2 小时前
Python 智能体开发实战 10:本地跑得好好的,一并发就崩?把它做成一个能上线的服务
python·agent
威哥爱编程2 小时前
Python 智能体开发实战 09:改了提示词,到底是变好还是变坏?搭一套能打分的离线评测
python·agent