选择排序概述
选择排序的核心思想很直观:每一趟从待排序序列中选取一个关键字值最小的记录,将其放到已排序序列的末尾。第 1 趟从 n 个记录中选最小,第 2 趟从剩下的 n-1 个中选次小,直到所有记录归位。
直接选择排序
核心原理
直接选择排序是最基础的形式。它在每一轮遍历中扫描剩余未排序部分,找到最小元素并与当前位置交换。虽然实现简单,但它的比较次数固定,无论数据是否有序,时间复杂度始终为 O(n²)。

过程示例
假设待排序序列为 { 5, 3, 6, 4, 7, 1, 8, 2 }。
初始状态视为无序。第一趟从整个序列选出最小值 1,与第一个位置 5 交换;第二趟从剩余序列选出最小值 2,与第二个位置 3 交换。每趟结束后,有序区长度 +1,无序区长度 -1。
代码实现
public void selectSort() {
RecordNode temp;
// 进行 i-1 次遍历,this.curlen 为数组长度
for (int i = 0; i < this.curlen - 1; i++) {
int min = i;
// 在剩余元素中寻找最小值的索引
for (int j = i + 1; j < this.curlen; j++) {
if (r[j].key.compareTo(r[min].key) < 0) {
min = j;
}
}
// 如果找到的最小值不是当前位置,则交换
if (min != i) {
temp = r[i];
r[i] = r[min];
r[min] = temp;
}
}
}
性能分析
直接选择排序是不稳定排序。它的主要优点是交换次数少(最多 n-1 次),适合对稳定性要求不高且移动操作代价较大的场景。
树形选择排序
核心原理
为了减少直接选择排序中大量的比较次数,树形选择排序引入了锦标赛的思想。将 n 个记录看作叶子节点,两两比较,较小者上升作为父节点,重复此过程直到根节点即为最小值。找到最小值后,将其替换为无穷大,重新调整路径上的节点,即可得到次小值。





