【C语言】深入解析选择排序算法

news/2024/5/19 17:36:30

    • 一、算法原理
    • 二、算法性能分析
    • 三、C语言实现示例
    • 四、总结

一、算法原理

 选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是不断地选择剩余元素中的最小(或最大)元素,放到已排序的序列的末尾,直到排序完整个序列。

选择排序的主要步骤如下:

  1. 在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。
  2. 从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。
  3. 重复第二步,直到所有元素均排序完毕。

请添加图片描述

二、算法性能分析

  • 时间复杂度:最好、最坏和平均时间复杂度均为O( n 2 n^2 n2)。
  • 空间复杂度:O(1),选择排序只需要一个额外的存储空间用于交换元素。
  • 稳定性:不稳定,选择排序在找到最小(或最大)元素后,需要和序列的起始位置进行交换,可能会导致相同元素的相对顺序发生改变。

三、C语言实现示例

以下是一个使用C语言实现的选择排序算法的示例:

#include <stdio.h>
void selectionSort(int arr[], int n) {int i, j, min_idx;// 一遍又一遍地遍历未排序的部分for (i = 0; i < n - 1; i++) {// 找到最小元素的索引min_idx = i;for (j = i + 1; j < n; j++) {if (arr[j] < arr[min_idx]) {min_idx = j;}}// 将找到的最小元素与第i个位置的元素交换if (min_idx != i) {int temp = arr[i];arr[i] = arr[min_idx];arr[min_idx] = temp;}}
}
// 打印数组的函数
void printArray(int arr[], int size) {int i;for (i = 0; i < size; 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("Sorted array: \n");printArray(arr, n);return 0;
}

运行上述代码,将会得到已排序的数组:

Sorted array: 
11 12 22 25 64 

四、总结

 选择排序是一种简单直观的排序算法,易于实现,但时间复杂度较高,适用于数据量较小的场景。在实际应用中,应根据具体需求选择合适的排序算法。希望本文对您有所帮助。


http://www.mrgr.cn/p/40565572

相关文章

科普:嵌入式代码软件在环(SiL)测试的可靠性

​​关键词:嵌入式系统、软件在环(SiL)、测试、生命周期01.简介当前,嵌入式系统开发的大趋势为通过软件实现大量的硬件功能,这导致软件的复杂程度显著上升——代码开发成本和风险也成倍增加。复用已有系统中的软件组件是改进嵌入式系统生命周期的一种可能的解决方案,对代…

hitcontraining_heapcreator

[BUUCTF]hitcontraining_heapcreator UAF|Off-By-One|堆溢出 对应libc版本libc6_2.23-0ubuntu9_amd64 [*] /home/bamuwe/heapcreator/heapcreatorArch: amd64-64-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: No PIE (0x3fc000)bamu…

django自定义构建模板,通过bootstrap实现菜单隐藏和显示

实现后的界面1.自定义页面模板实现 主页面代码(home.html) {% extends layout.html %} #引用模板 {% load static %} {% block content %}<h3>欢迎登录</h3> {% endblock %}自定义内容layout.html文件设置(模板){% load static %} {% load menu %} #导入me…

五一~感恩回馈,SolidKits工具折扣来袭!

SOLIDWORKS插件多样且丰富,有着不同的种类和用途,可以为SOLIDWORKS软件本身提升使用效率,更快速的响应你的操作方式。SolidKits自主设计研发多款SOLIDWORKS增效插件,包括:自动化参数设计插件、高级BOM插件、批量编码器插件、标准件增强工具等,也可提供按需定制开发服务。…

蓝桥杯2024年第十五届省赛真题-握手问题

方法一&#xff1a;模拟 #include<bits/stdc.h> using namespace std; #define int long long const int n1e6; int a,b[n],c; signed main() {for(int i1;i<50;i){for(int ji1;j<50;j){if(i<7&&j<7){continue;}c;}}cout<<c<<endl; }方…

wstunnel (websocket模式ssh)

接上一篇 修改客户端运行参数 ssh -o ProxyCommand"./wstunnel client -L stdio://%h:%p ws://192.168.254.131:8080" 127.0.0.1 其中127.0.0.1为服务端的本地ssh访问&#xff0c;可以修改为通过服务端访问其他设备的ssh服务。例如&#xff1a; ssh -o ProxyComma…

一个java项目中,如何使用sse协议,构造一个chatgpt的流式对话接口

前言 如何注册chatGPT&#xff0c;怎么和它交互&#xff0c;本文就不讲了&#xff1b;因为网上教程一大堆&#xff0c;而且你要使用的话&#xff0c;通常会再包一个算法服务&#xff0c;用来做一些数据训练和过滤处理之类的&#xff0c;业务服务基本不会直接与原生chatGPT交互。…

使用自己云服务器frp内网穿透记录

1.前提是自己现有云服务器已经2.下载对应的版本,我使用的是052.3下载地址 https://github.com/fatedier/frp/releases需要注意:下载的linux版本是服务端。windows是客户端 后续需要修改对用的配置文件 3.解压linux3.1 编辑配置文件vi frps.toml bindPort = 7000 # 服务运行端…

.net6 ILogger日志保存到本地

1、新建一个LocalFileLogger的类public class LocalFileLogger : ILogger{private readonly string categoryName;private readonly string basePath;public LocalFileLogger(string categoryName){this.categoryName = categoryName;string[] fieldstrs = Enum.GetNames(typeo…

CISCN2023-华北-normal_snake

就得审java。 路由分析 老规矩,先看看路由:/read路由下传参data,pyload不能包含!!,然后用了yaml来load传入的参数。 稍作了解,这其实就是 SnakeYaml 反序列化漏洞,禁用了 yaml 的常用头 !!。 前面的!!是用于强制类型转化,强制转换为!!后指定的类型,其实这个和Fastjson的…

如何用Sublime Text实现正则查找与替换

比如将下面的汉字语义加上中括号[{"text": "微笑","path": "emot01.png"},{"text": "大笑","path": "emot02.png"},{"text": "鼓掌","path": "emot03.pn…

STM32之UASRT试验

一、实验目的 1.实现STM32F407开发板与上位机工具通讯,中断方式具体实现的效果:上电后,下位机主动发送hello world ,上位机收到并显示;上位机发送数字0~9 ,回复: zero ~ nine 2.通讯协议,后面补充 3.硬件使用野火开发版STM32F407 4.与开发板连接的接口是Usb转串口,根据…

什么是uniapp----分包

前言 还是同样的需求(uniapp的主包要求大小不得大于2MB),但是就算将能封装的都封装了还是会超过2MB,本文将介绍第二个优化点:分包开发 一、什么是分包开发? 有很多小伙伴一听分包开发认为就是多建几个文件夹,到时候引用就行了,说对对,但也不对,慢慢看下去就知道原因了…

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码&#xff0c;解压即可食用&#xff0c;支持在本地浏览器打开。 安装教程 纯HTML&#xff0c;直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

spring-接口大全

1. Bean 相关 1. InitializingBean InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。 demo @Component public class MyInitBean implements InitializingBean {public void after…

设计不外流,保护创意的同时锁住图纸安全!

在设计行业中,图纸和创意文稿的安全至关重要,因为它们体现了企业的创新能力和核心竞争力。华企盾DSC数据防泄密系统提供了一系列功能,可以有效地保护这些珍贵的设计和文档不被外泄。以下是如何利用华企盾DSC系统保障设计图纸安全的关键措施:全面的加密模式:华企盾DSC系统提…

告别写作难题:探索三款AI写作助手,让你的创作更高效

在互联网时代&#xff0c;写作已经成为了一项基本的技能。无论是个人博客、公众号文章、还是商业文案&#xff0c;写作都是必不可少的一环。但是&#xff0c;很多人在写作过程中会遇到各种各样的问题&#xff0c;比如缺乏灵感、语言表达不清、排版混乱等。这时候&#xff0c;AI…

dns服务器

DNS查询方式 dns服务器有两种查询方式:递归查询:在递归查询中,客户端向本地DNS服务器发送一个域名解析请求,并要求该DNS服务器负责完成整个解析过程。 如果本地DNS服务器拥有所请求的域名解析信息,则它会直接回复客户端,并负责向其他DNS服务器查询所需的信息。 如果本地D…

LM1875L-TB5-T 音频功率放大器 PDF中文资料_参数_引脚图

LM1875L-TB5-T 规格信息&#xff1a; 商品类型音频功率放大器 音频功率放大器的类型- 输出类型1-Channel (Mono) 作业电压16V ~ 60V 输出功率25W x 1 4Ω 额外特性过流保护,热保护 UTC LM1875是一款单片功率放大器&#xff0c;可为消费类音频应 用提供极低失真和高品质的…

安装1Panel管理面板

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 安装部署:curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && bash quick_start.sh 手动安装dockerhttps://docker-practice.github.io/zh-cn/install/raspberr…