数据结构“小透明”:选择排序算法,其实超有料!

目录

一、算法世界初印象

二、选择排序大揭秘

2.1 核心原理剖析

2.2 算法步骤详解

三、代码实战:Python 实现选择排序

3.1 代码框架搭建

3.2 代码执行流程

四、性能大起底

4.1 时间复杂度剖析

4.2 空间复杂度分析

4.3 稳定性探讨

五、应用场景挖掘

5.1 教学领域大放异彩

5.2 小规模数据处理优势

5.3 特殊场景应用

六、与其他排序算法的华山论剑

6.1 对比快速排序

6.2 对比冒泡排序

七、选择排序的进阶之路

7.1 双元选择优化

7.2 优化效果分析

八、结语:选择排序的价值与启示


一、算法世界初印象

        想象一下,你面前有一个杂乱无章的书架,各种书籍横七竖八地摆放着。你想要整理这个书架,让所有的书按照从薄到厚的顺序排列。你会怎么做呢?

        很自然地,你可能会先从所有书中找出最薄的那一本,把它放在书架的最左边,这就确定了第一本书的位置。接着,在剩下的书中再找出最薄的,放在第一本书的右边,以此类推。每一次,你都从剩余未排序的书中选择最小(薄)的元素,放到已排序部分的末尾,直到所有的书都排列整齐。

        这种在生活中整理书架的思路,其实就是计算机科学中选择排序算法的核心思想。在编程的世界里,我们会遇到各种各样需要排序的数据,比如学生的成绩、员工的工资、商品的价格等等。选择排序作为一种简单直观的排序算法,就像整理书架一样,能够帮助我们将无序的数据变得有序,是算法学习道路上的一块重要基石 。接下来,就让我们深入探索选择排序算法的奥秘吧!

二、选择排序大揭秘

2.1 核心原理剖析

        选择排序,如其名,重点在于 “选择”。它的核心原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,存放到已排好序的数列的末尾,直到全部待排序的数据元素排完 。

        假设我们有一个数组 [5, 3, 8, 2, 9],现在要用选择排序将它从小到大排序。首先,我们把整个数组看作是未排序的部分。第一轮,我们从这个未排序的数组中寻找最小的元素,很明显是 2,然后把它和数组的第一个元素 5 交换位置,此时数组变为 [2, 3, 8, 5, 9],这样就确定了第一个最小的元素,它已经在正确的位置上了,也就是已排序序列增加了一个元素,而未排序序列减少了一个元素 。接着,我们在剩下的未排序部分 [3, 8, 5, 9] 中继续寻找最小的元素,是 3,将其与未排序部分的第一个元素(此时是 3 本身,位置不变)。然后再在 [8, 5, 9] 中找最小元素 5,和未排序部分的第一个元素 8 交换,数组变为 [2, 3, 5, 8, 9] 。以此类推,直到所有元素都排好序。

2.2 算法步骤详解

初始状态:把整个数组 arr 当作未排序序列,假设有数组 arr = [64, 25, 12, 22, 11]。

第一轮排序

  • 寻找最小元素:从数组的第一个元素开始,依次比较每个元素。先假设第一个元素 64 是最小的,然后与后面的元素比较。当比较到 11 时,发现 11 比 64 小,所以更新最小元素为 11 ,其索引为 4。

  • 交换元素:将最小元素 11 与数组的第一个元素 64 交换位置,此时数组变为 [11, 25, 12, 22, 64],第一个位置的 11 已排好序,剩余 [25, 12, 22, 64] 为未排序部分。

第二轮排序

  • 寻找最小元素:在未排序部分 [25, 12, 22, 64] 中,假设第一个元素 25 是最小的,继续比较。当比较到 12 时,发现 12 更小,更新最小元素为 12 ,索引为 2。

  • 交换元素:将最小元素 12 与未排序部分的第一个元素 25 交换位置,数组变为 [11, 12, 25, 22, 64],前两个位置的 11 和 12 已排好序,未排序部分为 [25, 22, 64]。

第三轮排序

  • 寻找最小元素:在未排序部分 [25, 22, 64] 中,假设第一个元素 25 是最小的,比较后发现 22 更小,更新最小元素为 22 ,索引为 3。

  • 交换元素:将最小元素 22 与未排序部分的第一个元素 25 交换位置,数组变为 [11, 12, 22, 25, 64],前三个位置已排好序,未排序部分为 [25, 64]。

第四轮排序

  • 寻找最小元素:在未排序部分 [25, 64] 中,比较后发现 25 是最小的,索引为 0。

  • 交换元素:因为最小元素就是未排序部分的第一个元素,所以不需要交换,数组保持 [11, 12, 22, 25, 64] 不变,此时整个数组已全部排好序。

        经过这一系列的步骤,原本无序的数组就按照从小到大的顺序排列好了。选择排序就是通过这样一次次地选择最小元素并交换位置,逐步将数组排序,其过程简单直接,却蕴含着算法的基本思想和逻辑 。

三、代码实战:Python 实现选择排序

3.1 代码框架搭建

        下面是用 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

# 测试代码

arr = [64, 25, 12, 22, 11]

sorted_arr = selection_sort(arr)

print("排序后的数组:", sorted_arr)

        逐行分析这段代码:

  • def selection_sort(arr)::定义一个名为selection_sort的函数,它接受一个列表arr作为参数,这个列表就是我们要排序的数组。

  • n = len(arr):获取数组arr的长度,这个长度在后续的循环中会用到。

  • for i in range(n)::外层循环,它会遍历数组的每一个元素。这里的i代表当前已经排好序的元素个数,每一轮循环都会确定一个元素的最终位置 。

  • min_idx = i:假设当前索引i处的元素是未排序部分的最小值,将其索引记录在min_idx中 。

  • for j in range(i + 1, n)::内层循环,从i + 1开始到数组末尾,用于在未排序部分中寻找真正的最小值。这里的j是用来遍历未排序部分的元素索引 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值