选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每一趟从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。以下是选择排序的详细介绍:
1. 算法步骤
- 初始状态:假设有一个长度为
n
的数组arr
,待排序的元素集合为整个数组。 - 第一趟排序:
- 从数组的第一个元素开始,将其视为当前最小元素,记录其索引。
- 遍历数组中剩余的元素,与当前最小元素比较。如果找到比当前最小元素更小的元素,则更新最小元素及其索引。
- 遍历结束后,将找到的最小元素与数组的第一个位置的元素交换位置。此时,数组的第一个元素就是整个数组中的最小元素,即已完成第一个位置的排序。
- 后续排序:
- 对数组中从第二个元素开始到最后一个元素的子数组重复上述步骤。每次找到子数组中的最小元素,并将其与子数组的起始位置元素交换。
- 每完成一趟排序,已排序的元素个数就增加一个,待排序的子数组长度就减少一个。
- 最终状态:经过
n - 1
趟排序后,整个数组就被排好序了。
2. 代码实现
下面是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]
return arr
3. 算法分析
- 时间复杂度:选择排序的时间复杂度是 \(O(n^2)\),因为无论数组的初始状态如何,都需要进行 \(n - 1\) 趟比较,每趟比较的次数依次为 \(n - 1\), \(n - 2\),..., 1,总的比较次数为 \(1 + 2 +... + (n - 1) = \frac{n(n - 1)}{2}\)。
- 空间复杂度:选择排序的空间复杂度是 \(O(1)\),因为它只需要有限的额外空间来进行交换操作,不需要与输入规模相关的额外空间。
- 稳定性:选择排序是一种不稳定的排序算法。例如,对于数组
[5,5,3]
,在排序过程中,第一个5
可能会与3
交换位置,导致两个5
的相对顺序发生改变。