简单选择排序
在选择排序中,简单选择排序是最直观的一种,它的思路类似日常生活中从一堆物品里挑出最小的那个放到指定位置,再从剩下的物品里挑出最小的继续放置,直到所有物品都按顺序排好。这种排序方式的核心是“逐趟选最小(或最大),放到对应位置”,每一趟排序都会确定一个元素的最终位置,后续排序无需再处理该元素。
1. 简单选择排序的核心思想与执行流程
简单选择排序的核心逻辑允许概括为“遍历选最小、交换到首位、逐趟缩范围”:
- 从待排序数组的第一个元素开始,遍历整个未排序区间,找到其中值最小的元素;
- 将这个最小元素与未排序区间的第一个元素交换位置,此时该最小元素被放入已排序区间的末尾;
- 缩小未排序区间的范围(去掉已确定位置的元素),重复上述“选最小、交换”的过程,直到未排序区间只剩下一个元素(此时数组已完全有序)。
我们以数组arr = {49, 38, 65, 97, 76, 13, 27, 49}为例,详细展示简单选择排序的每一趟执行过程:
初始数组:
[49, 38, 65, 97, 76, 13, 27, 49](未排序区间:0~7,已排序区间为空)第一趟排序(目标:从0~7中选最小元素,放到位置0):
- 遍历未排序区间,比较所有元素:49、38、65、97、76、13、27、49,发现最小元素是13(位置5);
- 将13与未排序区间的第一个元素(位置0的49)交换,数组变为
[13, 38, 65, 97, 76, 49, 27, 49];
第一趟结束,已排序区间:[13],未排序区间缩小为1~7。
第二趟排序(目标:从1~7中选最小元素,放到位置1):
遍历未排序区间1~7的元素:38、65、97、76、49、27、49,最小元素是27(位置6);
将27与位置1的38交换,数组变为[13, 27, 65, 97, 76, 49, 38, 49];
第二趟结束,已排序区间:[13, 27],未排序区间缩小为2~7。第三趟排序(目标:从2~7中选最小元素,放到位置2):
遍历元素65、97、76、49、38、49,最小元素是38(位置6);
与位置2的65交换,数组变为[13, 27, 38, 97, 76, 49, 65, 49];
已排序区间:[13, 27, 38],未排序区间:3~7。后续趟次:
第四趟从3~7中选最小元素49(位置5),与位置3的97交换,数组变为[13, 27, 38, 49, 76, 97, 65, 49];
第五趟从4~7中选最小元素49(位置7),与位置4的76交换,数组变为[13, 27, 38, 49, 49, 97, 65, 76];
第六趟从5~7中选最小元素65(位置6),与位置5的97交换,数组变为[13, 27, 38, 49, 49, 65, 97, 76];
第七趟从6~7中选最小元素76(位置7),与位置6的97交换,数组变为[13, 27, 38, 49, 49, 65, 76, 97];
此时未排序区间只剩最后一个元素,排序完成。
2. 轻松选择排序的代码实现
简单选择排序的代码逻辑清晰,核心是“找最小值位置”和“交换元素”,以下是C语言实现,代码精简且注释详细:
void SelectSort(int arr[], int n) {
int i, j, minIdx, temp;
for (i = 0; i < n - 1; i++) { // 已排序区间:0~i-1,需n-1趟
minIdx = i; // 假设未排序区间第一个元素是最小的
// 遍历未排序区间i~n-1,找最小值位置
for (j = i + 1; j < n; j++) {
if (arr[j] < arr[minIdx]) {
minIdx = j; // 更新最小值位置
}
}
// 交换最小值与未排序区间第一个元素
temp = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = temp;
}
}
代码说明:
- 外层循环
i控制排序趟次(共n-1趟),每趟确定一个元素的最终位置(位置i); - 内层循环
j遍历未排序区间(i~n-1),通过minIdx记录最小值的位置; - 每趟结束后,将最小值(位置
minIdx)与未排序区间的第一个元素(位置i)交换,完成该元素的定位。
3. 轻松选择排序的性能与特性
时间复杂度:
无论数组初始状态如何,每趟都需要遍历未排序区间找最小值,总比较次数为n(n-1)/2,因此最好、最坏、平均情况的时间复杂度均为O(n²)。空间复杂度:仅需一个临时变量(temp)和记录最小值位置的变量(minIdx),空间复杂度为
O(1),属于“原地排序”。稳定性:当存在相同元素时,交换过程可能改变它们的相对顺序。例如,数组
[2, 2, 1]中,第一趟会将1与第一个2交换,导致两个2的相对位置颠倒,因此简单选择排序是不稳定的排序算法。
4. 适用场景
简单选择排序适合以下场景:
- 数据量较小的数组(如n<100):此时
O(n²)的时间复杂度可接受,且代码实现简单,易于理解和维护; - 对交换次数敏感的场景:相比冒泡排序(可能多次交换),简单选择排序每趟只交换一次,总交换次数为n-1次,在交换成本较高的场景(如元素体积大)更有优势;
- 对排序稳定性无要求的场景:其不稳定特性不影响最终结果的正确性。
综上,简单选择排序通过“逐趟选最小、一次交换”的方式实现排序,逻辑直观,交换次数少,但比较次数固定,时间复杂度为O(n²)。它是学习选择排序思想的基础,适合小规模数据的排序需求。
浙公网安备 33010602011771号