选择排序算法

一、选择排序简介

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

实现过程如下:

  1. 工作原理

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

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

二、选择排序图解

三、选择排序代码实现

选择排序代码部分实现:

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

cpp 复制代码
// 选择排序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完整代码:

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; // 假设数组最大长度为100
    int 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) )。

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

相关推荐
tainshuai1 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
Coovally AI模型快速验证7 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun7 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao348 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng11338 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
啊阿狸不会拉杆9 小时前
《算法导论》第 32 章 - 字符串匹配
开发语言·c++·算法
小学生的信奥之路9 小时前
洛谷P3817题解:贪心算法解决糖果分配问题
c++·算法·贪心算法
你知道网上冲浪吗10 小时前
【原创理论】Stochastic Coupled Dyadic System (SCDS):一个用于两性关系动力学建模的随机耦合系统框架
python·算法·数学建模·数值分析
地平线开发者11 小时前
征程 6 | PTQ 精度调优辅助代码,总有你用得上的
算法·自动驾驶
Tisfy12 小时前
LeetCode 837.新 21 点:动态规划+滑动窗口
数学·算法·leetcode·动态规划·dp·滑动窗口·概率