您的位置:首页 > 教育 > 锐评 > 选择排序算法

选择排序算法

2024/10/6 14:25:43 来源:https://blog.csdn.net/qq_55610255/article/details/140065856  浏览:    关键词:选择排序算法

一、选择排序简介

选择排序(Selection Sort)是一种简单直观的排序算法,其基本思想是每次从未排序的部分选择最小(或最大)的元素,然后放到已排序部分的末尾。

实现过程如下:

  1. 工作原理

    • 扫描整个数组,找到最小的元素,并将其与数组的第一个元素交换位置。
    • 接着,在剩余未排序的元素中找到最小的元素,将其与数组的第二个元素交换位置。
    • 依次类推,直到整个数组排序完成。
  2. 详细步骤

    • 从数组的第一个元素开始,假设它是未排序部分的最小值。
    • 依次与后面的元素比较,找到比当前最小值还小的元素,则更新最小值的位置。
    • 找到未排序部分的最小值后,与未排序部分的第一个元素交换位置。
    • 然后,将排序的范围扩展到下一个位置,重复上述步骤,直到所有元素都被排序。

二、选择排序图解

三、选择排序代码实现

选择排序代码部分实现:

通过自定义函数内部实现选择排序算法,my_selection函数接收一维数组array,元素总数num和string类型str,通过双for循环实现内循环记录最小值的下标,外循环遍历,最终实现从小到大或从大到小对整数元素的排序功能。

// 选择排序1
void my_selection(int array[], int num, string str) {for (int i = 0; i < num - 1; ++i) {int min_index = i;  // 假设当前未排序部分的第一个元素是最小值的索引for (int j = i + 1; j < num; ++j) {if (str == "大") {// 从小到大排序if (array[j] < array[min_index]) {min_index = j;}} else if (str == "小") {// 从大到小排序if (array[j] > array[min_index]) {min_index = j;}} else {cout << "非法字符,结束排序!" << endl;return;}}// 将找到的最小元素与未排序部分的第一个元素交换位置if (min_index != i) {swap(array[i], array[min_index]);}}
}// 选择排序2
void my_selection(int array[], int num, string str) {for (int i = 0; i < num - 1; ++i) {int min_index = i;  // 假设当前未排序部分的第一个元素是最小值的索引for (int j = i + 1; j < num; ++j) {if (str == "大") {// 从小到大排序if (array[j] < array[min_index]) {min_index = j;}} else if (str == "小") {// 从大到小排序if (array[j] > array[min_index]) {min_index = j;}} else {cout << "非法字符,结束排序!" << endl;return;}}// 将找到的最小元素与未排序部分的第一个元素交换位置if (min_index != i) {int temp = array[i];array[i] = array[min_index];array[min_index] = temp;}}
}

select_sort.cpp完整代码:

#include <iostream>
#include <sstream>
#include <limits>
using namespace std;// 函数声明
void my_input_number(int array[], int num);
int my_bubble(int array[], int num, string str);
void my_print(int array[], int num);// 存储输入的数字到数组
void my_input_number(int array[], int num) {cout << "请输入 " << num << " 个整数:";for (int i = 0; i < num; ++i) {cin >> array[i];}
}// 选择排序
void my_selection(int array[], int num, string str) {for (int i = 0; i < num - 1; ++i) {int min_index = i;  // 假设当前未排序部分的第一个元素是最小值的索引for (int j = i + 1; j < num; ++j) {if (str == "大") {// 从小到大排序if (array[j] < array[min_index]) {min_index = j;}} else if (str == "小") {// 从大到小排序if (array[j] > array[min_index]) {min_index = j;}} else {cout << "非法字符,结束排序!" << endl;return;}}// 将找到的最小元素与未排序部分的第一个元素交换位置if (min_index != i) {swap(array[i], array[min_index]);}}
}// 打印排序后的数组
void my_print(int array[], int num) {cout << "排序后的数组:" << endl;for (int i = 0; i < num; ++i) {cout << array[i] << " ";}cout << endl;
}int main() {const int MAX_SIZE = 100; // 假设数组最大长度为100int array[MAX_SIZE];int num;string str;cout << "请输入数组长度:";while (!(cin >> num) || num <= 0 || num > MAX_SIZE) {cout << "无效的数组长度!请输入一个有效的正整数:";cin.clear();             // 清除错误标志cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空输入缓冲区}cout << "请输入排序要求('大' 表示从小到大排序,'小' 表示从大到小排序):";while (!(cin >> str) || (str != "大" && str != "小")) {cout << "无效的排序要求!请输入 '大' 或 '小': ";cin.clear();             // 清除错误标志cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 清空输入缓冲区}my_input_number(array, num); // 存储输入的数字到数组my_selection(array, num, str);  // 对数组进行排序my_print(array, num);        // 打印排序后的数组return 0;
}

运行结果:

 

 四、总结

小结:选择排序算法它每一轮排序过后在未排序部分选取最小(或最大)的元素,然后放到已排序部分的末尾,直到所有的元素都排序完毕,这种排序算法仿佛我在千万人海中挑一群人排队去滑稽,先挑出个子高的排在后面,然后再挑出稍微高的排在中间,最后挑出个子矮的排在前头。

时间复杂度:选择排序的时间复杂度为 ( O(n^2) ),其中 ( n ) 是数组的大小。这是因为每次选择都要扫描剩余未排序的部分。

空间复杂度:选择排序是一种原地排序算法,只需要常数级别的额外空间用于存储临时变量,空间复杂度为 ( O(1) )。

稳定性:选择排序是一种不稳定的排序算法,因为交换操作可能改变相同元素之间的相对顺序。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com