图解简单选择排序C语言实现

1 简单选择排序

简单选择排序(Simple Selection Sort)是一种基础且直观的排序算法,其核心思想是通过重复选择未排序部分中的最小(或最大)元素,并将其放到已排序部分的末尾,逐步完成整个序列的排序。

1.1 基本概念与原理

简单选择排序(Simple Selection Sort)是一种基于比较的原地排序算法,其核心思想是将待排序序列分为已排序和未排序两部分,通过不断选择未排序部分中的最小元素,并将其交换到已排序部分的末尾,逐步完成整个序列的排序。
该算法的主要特点包括:
‌不稳定排序‌:相同元素的相对位置可能在排序过程中改变
‌原地排序‌:不需要额外的存储空间
直观简单‌:算法逻辑易于理解和实现
选择排序的基本原理可以类比为"每次从剩余未排序元素中挑选最小的一个放到正确位置"。这种逐步选择最小元素的策略使得算法具有确定性,无论输入数据的初始顺序如何,其比较次数都是固定的。

1.2 算法执行过程

选择排序的具体执行步骤如下:
‌1.初始化阶段‌
(1)将整个数组视为未排序部分
(2)已排序部分初始为空
2‌.查找最小值阶段‌
(1)从当前未排序部分的第一个元素开始遍历
(2)记录当前最小元素的索引
‌3.比较交换阶段‌
(1)将当前元素与已记录的最小元素比较
(2)如果发现更小的元素,更新最小元素索引
4‌.位置交换阶段‌
(1)遍历完成后,将未排序部分的第一个元素与找到的最小元素交换
(2)此时已排序部分增加一个元素
‌5.迭代重复‌
(1)缩小未排序部分的范围
(2)重复步骤2-4,直到未排序部分只剩一个元素
执行示例
以数组[64, 25, 12, 22, 11]为例:
第一轮:找到最小值11,与64交换 → [11, 25, 12, 22, 64]
第二轮:在剩余部分找到最小值12,与25交换 → [11, 12, 25, 22, 64]
第三轮:找到最小值22,与25交换 → [11, 12, 22, 25, 64]
第四轮:找到最小值25,位置正确 → 排序完成

1.3 算法复杂度分析

时间复杂度
‌最坏情况‌:O(n²) - 需要进行n(n-1)/2次比较
‌最好情况‌:O(n²) - 即使输入已经有序,仍需相同数量的比较
‌平均情况‌:O(n²) - 比较次数与输入顺序无关
空间复杂度
‌空间复杂度‌:O(1) - 仅需常数级别的额外空间用于交换元素

1.4 C语言实现简单选择排序

#include <stdio.h>#define SORT_DATA_TYPE int/*** @brief 打印数据** @param arr 数组* @param n 数组元素个数*/
void print_array(int arr[], unsigned int n)
{unsigned int i;for (i = 0; i < n; i++){printf("%d ", arr[i]);}printf("\n");
}/*** @brief 简单选择排序** @param arr 待排序的数组* @param n 数组元素个数*/
void simple_selection_sort(SORT_DATA_TYPE arr[], unsigned int n)
{int swap_flg;SORT_DATA_TYPE temp;unsigned int i;unsigned int j;for (i = 0; i < (n - 1); i++){for (j = (i + 1); j < n; j++){if (arr[j] < arr[i]){temp = arr[i];arr[i] = arr[j];arr[j] = temp;}print_array(arr, n); /* 查看每次排序结构,调试使用 */}}
}int main()
{SORT_DATA_TYPE arr[] = {1, 2, 3, 4};unsigned int n = sizeof(arr) / sizeof(arr[0]);printf("old arr : ");print_array(arr, n);simple_selection_sort(arr, n);printf("new arr : ");print_array(arr, n);return 0;
}


不同类型的数组直接将SORT_DATA_TYPE全部替换为需要的类型,然后删除多余的宏定义即可支持任意类型数组的简单选择排序。

1.5 简单测试

通过使用2个数组[4,3,2,1]及[1,2,3,4]演示最坏情况和最好情况简单选择排序的执行过程:
最坏情况
在这里插入图片描述
最坏情况需要进行n(n-1)/2次比较,也就是6次比较。可以使用如下图片演示这一过程:
在这里插入图片描述
最好情况
在这里插入图片描述
最好情况需要进行n(n-1)/2次比较,也就是6次比较。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/2790.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[go] 桥接模式

桥接模式 是一种结构型设计模式&#xff0c; 可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构&#xff0c; 从而能在开发时分别使用。 模型说明抽象部分&#xff08;Abstraction&#xff09;提供高层控制逻辑&#xff0c;依赖于完成底层实际工作的实现对象…

【自用】JavaSE--特殊文件Properties与XML、日志技术

特殊文件概述使用特殊文件可以存储多个有关系的数据&#xff0c;作为系统的配置信息属性文件类似于键值对&#xff0c;一一对应存储数据(比如用户名与密码)XML文件存储多个用户的多个属性更适合&#xff0c;适合存储更复杂的数据Properties注&#xff1a;这个属性文件的后缀即使…

【轨物方案】预防性运维:轨物科技用AI+机器人重塑光伏电站价值链

传统光伏电站的运维模式&#xff0c;常常被视为一个“成本中心”&#xff0c;其“故障-抢修”的逻辑模式&#xff0c;不仅响应滞后、效率低下&#xff0c;更难以从根本上提升资产的长期价值。然而&#xff0c;随着新能源行业的深刻发展&#xff0c;运维的价值被重新定义&#x…

【自动化运维神器Ansible】Ansible比较操作符详解:从基础到实战应用

目录 引言 1 Ansible比较操作符概述 1.1 什么是比较操作符&#xff1f; 1.2 比较操作符的分类与核心符号 2 核心比较操作符详解 2.1 相等与不等&#xff1a;与! 语法与基础用法 示例&#xff1a;字符串与数值比较 注意事项 2.2 大小比较&#xff1a;>、>、<…

配置 Docker 镜像加速,解决 docker pull 拉取镜像失败、docker search 查询镜像失败等问题

一、概述 记录时间 [2025-08-16] 在 Docker 学习中&#xff0c;可能会遇到诸如 docker 远程仓库无法访问、docker pull 拉取镜像失败、docker search 查询镜像失败等问题。 这是由于国内网络对 docker 远程仓库的访问受到限制。 那么在国内如何获取 docker 镜像呢&#xff1f…

智能工厂生产监控大屏-vue纯前端静态页面练习

学习前端还是非常有意思的&#xff0c;因为前端真的是可见即所得&#xff0c;可以做出来非常好看漂亮的页面&#xff0c;最近我就在使用前端技术 做一些大屏报表&#xff0c;在制作这些大屏报表过程中&#xff0c;又熟练的练习了自己的学到的相关的前端技术&#xff0c;接下来把…

Android 欧盟网络安全EN18031 要求对应的基本表格填写

Android 欧盟网络安全EN18031 要求对应的基本表格填写 文章目录Android 欧盟网络安全EN18031 要求对应的基本表格填写一、背景二、18031认证预填表格三、其他1、Android EN 18031 要求对应的基本表格小结2、EN 18031的要求表格内容填写3、一定要做三方认证&#xff1f;4、欧盟网…

Java Lambda表达式是什么,怎么用

这种代码是什么&#xff0c;怎么阅读/*** 批量插入** param entityList ignore* param batchSize ignore* return ignore*/Transactional(rollbackFor Exception.class)Overridepublic boolean saveBatch(Collection<T> entityList, int batchSize) {String sqlStateme…

力扣习题:基本计算器

本片内容我们将针对于一个力扣中的一道很经典的习题&#xff1a;基本计算器。 这道题目十分经典&#xff0c;在很多大厂的面试题中都有出现过 因此我们将进一步来学习 该题目代码已经上传作者的个人gitee&#xff1a;CPP 学习代码库: C代码库新库&#xff0c;旧有C仓库满员了喜…

​​金仓数据库KingbaseES V9R1C10安装教程 - Windows版详细指南​

文章目录一、前言二、软件下载2.1 下载安装包2.2 下载授权文件三. 安装KingbaseES数据库3.1 解压安装包3.2 运行安装程序3.3 安装步骤详解步骤1&#xff1a;欢迎界面步骤2&#xff1a;许可协议步骤3&#xff1a;添加授权文件步骤4&#xff1a;选择安装路径步骤5&#xff1a;选择…

基于HTML5与Tailwind CSS的现代运势抽签系统技术解析

引言 浪浪山札记&#xff1a;献给所有在暗夜里倔强发光的普通人 一、系统概述 "每日运签"是一个基于现代Web技术构建的交互式运势抽取应用&#xff0c;结合了中国传统文化元素与现代UI设计理念。该系统采用HTML5、CSS3和JavaScript作为核心技术栈&#xff0c;并利用T…

面试题:如何用Flink实时计算QPS

Flink 实时计算 QPS 面试题题目&#xff1a; 假设某互联网应用日活用户 100 万&#xff0c;每天产生 1 亿条数据&#xff08;日志/事件&#xff09;&#xff0c;要求使用 Apache Flink 实现实时计算系统的 QPS&#xff08;Queries Per Second&#xff09;&#xff0c;并考虑以下…