目录
一、算法世界初印象
想象一下,你面前有一个杂乱无章的书架,各种书籍横七竖八地摆放着。你想要整理这个书架,让所有的书按照从薄到厚的顺序排列。你会怎么做呢?
很自然地,你可能会先从所有书中找出最薄的那一本,把它放在书架的最左边,这就确定了第一本书的位置。接着,在剩下的书中再找出最薄的,放在第一本书的右边,以此类推。每一次,你都从剩余未排序的书中选择最小(薄)的元素,放到已排序部分的末尾,直到所有的书都排列整齐。
这种在生活中整理书架的思路,其实就是计算机科学中选择排序算法的核心思想。在编程的世界里,我们会遇到各种各样需要排序的数据,比如学生的成绩、员工的工资、商品的价格等等。选择排序作为一种简单直观的排序算法,就像整理书架一样,能够帮助我们将无序的数据变得有序,是算法学习道路上的一块重要基石 。接下来,就让我们深入探索选择排序算法的奥秘吧!
二、选择排序大揭秘
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是用来遍历未排序部分的元素索引 。