选择排序被认为是不稳定的排序算法,主要是因为在排序过程中,它会通过交换元素位置来将最小(或最大)的元素放到正确的位置,而这种交换操作可能会破坏具有相同值的元素之间的相对顺序。
原理分析
选择排序的基本思想是:每一轮从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置(或末尾位置),然后再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾,以此类推,直到全部待排序的数据元素排完。
在这个过程中,选择排序会不断地将当前未排序部分的最小元素与未排序部分的第一个元素交换位置。这种交换操作是导致选择排序不稳定的关键原因。
实例说明
假设有一个数组 [5, 8, 5, 2],我们使用选择排序对其进行升序排序:
- 初始状态:
[5, 8, 5, 2] - 第1轮:找到最小元素
2,与第一个元素5交换位置,得到[2, 8, 5, 5] - 第2轮:从剩余元素
[8, 5, 5]中找到最小元素5,与第一个元素8交换位置,得到[2, 5, 8, 5] - 第3轮:从剩余元素
[8, 5]中找到最小元素5,与第一个元素8交换位置,得到[2, 5, 5, 8]
在这个例子中,原数组中的两个 5 的相对顺序被改变了。初始时,第一个 5 在第二个 5 之前,但经过排序后,第二个 5 被交换到了第一个 5 之前。这就说明选择排序没有保持相等元素的相对顺序,因此它是不稳定的。
代码验证
下面是选择排序的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 = [5, 8, 5, 2]
sorted_arr = selection_sort(arr)
print("排序前:", [5, 8, 5, 2])
print("排序后:", sorted_arr)
运行这段代码,输出结果为:
排序前: [5, 8, 5, 2]
排序后: [2, 5, 5, 8]
可以看到,排序后的两个 5 的顺序与原始顺序相比发生了变化,这验证了选择排序的不稳定性。