电商的网站设计网址收录入口
一、什么是选择排序?
-
定义:选择排序是一种简单直观的排序算法,每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。
-
类比:就像整理书架时,每次都从剩下的书中找到最小的那本,放在正确的位置。
- 特点:
-
时间复杂度为 (O(n^2)),适合小规模数据。
-
交换次数少,性能比冒泡排序略优。
-
二、选择排序的步骤
- 遍历未排序部分:
-
从数组的第一个元素开始,假设当前位置为最小值。
-
- 寻找最小值:
-
在未排序部分中找到最小值的索引。
-
- 交换元素:
-
将找到的最小值与未排序部分的第一个元素交换位置。
-
- 重复过程:
-
缩小未排序部分的范围,直到整个数组有序。
-
三、代码实现
1. 升序排序
#include <iostream>
using namespace std;int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < n - 1; i++) {int minIndex = i; // 假设当前未排序部分的第一个元素是最小值// 寻找未排序部分的最小值索引for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}// 交换最小值到已排序部分的末尾swap(arr[i], arr[minIndex]);}// 输出排序后的数组for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}
运行结果:
11 12 22 25 64
2. 降序排序
#include <iostream>
using namespace std;int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < n - 1; i++) {int maxIndex = i; // 假设当前未排序部分的第一个元素是最大值// 寻找未排序部分的最大值索引for (int j = i + 1; j < n; j++) {if (arr[j] > arr[maxIndex]) {maxIndex = j;}}// 交换最大值到已排序部分的末尾swap(arr[i], arr[maxIndex]);}// 输出排序后的数组for (int i = 0; i < n; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}
运行结果:
64 25 22 12 11
四、代码解析
-
外层循环:
-
控制已排序部分的边界(
i
表示当前已排序部分的末尾)。
-
-
内层循环:
-
在未排序部分(从
i+1
到n-1
)中寻找最小值(或最大值)的索引。
-
-
交换操作:
-
将找到的最小值(或最大值)与未排序部分的第一个元素交换。
-
五、时间复杂度分析
-
时间复杂度:(O(n^2))(无论最好或最坏情况)。
-
交换次数:(O(n))(比冒泡排序少,性能略优)。
六、竞赛注意事项
- 数据范围:
-
如果
n
超过 10000,选择排序可能超时,建议使用std::sort
。
-
- 代码简洁性:
-
选择排序代码简单,适合快速实现小规模排序。
-
- 优化策略:
-
如果已排序部分和未排序部分同时寻找最小值和最大值,可以减少循环次数(进阶技巧)。
-
七、综合练习
练习 1:排序学生成绩
输入 n
个学生的成绩,按升序输出。
参考代码:
#include <iostream>
using namespace std;int main() {int n;cin >> n;int scores[n];for (int i = 0; i < n; i++) {cin >> scores[i];}// 选择排序for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (scores[j] < scores[minIndex]) {minIndex = j;}}swap(scores[i], scores[minIndex]);}for (int i = 0; i < n; i++) {cout << scores[i] << " ";}cout << endl;return 0;
}
练习 2:找出第 k 小的元素
输入一个数组和整数 k
,使用选择排序找到第 k
小的元素。
参考代码:
#include <iostream>
using namespace std;int main() {int n, k;cin >> n >> k;int arr[n];for (int i = 0; i < n; i++) {cin >> arr[i];}// 选择排序,只排到第 k 个元素for (int i = 0; i < k; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}swap(arr[i], arr[minIndex]);}cout << "第 " << k << " 小的元素:" << arr[k-1] << endl;return 0;
}
八、总结
-
选择排序的核心是“选择最小值,交换位置”。
-
时间复杂度为 (O(n^2)),适合小规模数据。
-
竞赛建议:优先使用
std::sort
,但选择排序是理解排序原理的基础。 -
适用场景:数据量小、代码简洁性要求高时。