选择排序是一种简单直观的排序算法,时间复杂度为,其中 n 是数组长度,不适合大数据集的排序,适合于元素较少且对性能要求不高的场景。
选择排序的基本思想是:每次从未排序部分选择最小的元素,将其放到已排序部分的末尾。这样经过多轮操作后,整个数组会被逐步排好序。
具体步骤如下:
实现一个选择排序算法,用于对整数数组进行升序排序。输入是一个包含若干整数的数组,输出是排序后的数组。要求在原数组上进行排序,不借助额外的数组空间(即就地排序)。
假设有一个数组 arr,长度为 n。使用变量 minIndex 记录当前未排序区间中最小值的下标。具体步骤如下:
- #include
// 引入标准输入输出库,用于printf等函数 -
- // 定义选择排序函数,接收一个整型数组和数组的长度作为参数
- void selectionSort(int arr[], int n) {
- 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; // 更新最小值下标为当前更小元素的下标
- }
- }
- if (minIndex != i) { // 如果找到的最小值不是当前元素(即最小值下标发生了改变)
- int temp = arr[i]; // 交换元素,将找到的最小值元素与当前元素位置互换
- arr[i] = arr[minIndex];
- arr[minIndex] = temp;
- }
- }
- }
-
- // 定义打印数组函数,接收一个整型数组和数组的长度作为参数
- void printArray(int arr[], int n) {
- for (int i = 0; i < n; i++) { // 遍历数组
- printf("%d ", arr[i]); // 打印每个元素,元素之间用空格分隔
- }
- printf("\n"); // 打印完所有元素后换行
- }
-
- int main()
- {
- int arr[] = { 64, 25, 12, 22, 11 }; // 定义一个整型数组并初始化
- int n = sizeof(arr) / sizeof(arr[0]); // 计算数组的长度,即数组中元素的个数
- selectionSort(arr, n); // 调用选择排序函数对数组进行排序
- printf("排序后的数组: "); // 打印提示信息
- printArray(arr, n); // 调用打印数组函数输出排序后的数组
- return 0; // 程序正常结束,返回0
- }
- #include
// 引入输入输出流库,用于输入输出操作 - #include
// 引入向量库,用于使用动态数组 -
- using namespace std; // 使用标准命名空间,避免每次调用标准库时都需要加std::前缀
-
- // 定义选择排序函数,接收一个整数向量的引用作为参数,避免复制整个数组
- void selectionSort(vector<int>& arr) {
- int n = arr.size(); // 获取数组的长度
- for (int i = 0; i < n - 1; i++) { // 外层循环:从第0个元素遍历到倒数第二个元素
- int minIndex = i; // 假设当前未排序区的第一个元素为最小值,并记录其下标
- for (int j = i + 1; j < n; j++) { // 内层循环:从当前元素的下一个元素开始,遍历未排序区
- if (arr[j] < arr[minIndex]) { // 如果找到比当前最小值还小的元素
- minIndex = j; // 更新最小值下标为当前更小元素的下标
- }
- }
- if (minIndex != i) { // 如果找到的最小值下标不是当前元素的下标(即最小值发生了移动)
- swap(arr[i], arr[minIndex]); // 使用C++内置的swap函数交换两个元素的位置,将最小值放到已排序区的末尾
- }
- }
- }
-
- // 定义打印数组函数,接收一个整数向量的常量引用作为参数,避免修改原数组
- void printArray(const vector<int>& arr) {
- for (int i : arr) { // 使用范围for循环遍历数组中的每个元素
- cout << i << " "; // 打印每个元素,元素之间用空格分隔
- }
- cout << endl; // 打印完所有元素后换行
- }
-
- int main()
- {
- vector<int> arr = {64, 25, 12, 22, 11}; // 定义一个整数向量并初始化
- selectionSort(arr); // 调用选择排序函数对数组进行排序
- cout << "排序后的数组: "; // 打印提示信息
- printArray(arr); // 调用打印数组函数输出排序后的数组
- return 0; // 程序正常结束,返回0
- }