C语言经典算法之直接排序算法

目录

前言

一、代码实现

二、时空复杂度

时间复杂度:

空间复杂度:


前言

建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。

           2.建议读者学习算法的时候,自己手动一步一步地运行算法。

tips:希尔排序算法就是通过该算法衍生出来的,通过理解本算法可以为理解希尔排序打下基础。同时,本算法的逻辑简单。

直接排序算法,也称为选择排序(Selection Sort),是一种简单直观的排序算法。其基本思想是每一趟从待排序的数据元素中选择最小(或最大)的一个元素,将它与序列的第一个元素进行交换,然后再从剩余的元素中选择最小(或最大)的元素,与序列的第二个元素进行交换,如此循环,直到整个序列有序。总结就是,将无序元素与其前面的元素比较大小,以此来确定其位置,从而将其加入前面的有序的部分。

一、代码实现

#include <stdio.h>// 交换数组中两个元素的值
void swap(int *xp, int *yp) {int temp = *xp;*xp = *yp;*yp = temp;
}// 直接排序函数
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;// 将找到的最小元素与当前位置元素交换swap(&arr[min_idx], &arr[i]);}
}// 打印数组元素
void printArray(int arr[], int size) {for (int 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]);printf("原始数组: \n");printArray(arr, n);// 调用直接排序算法selectionSort(arr, n);printf("\n排序后的数组: \n");printArray(arr, n);return 0;
}

在这段代码中,swap 函数用于交换数组中两个元素的值,而 selectionSort 函数实现了直接排序算法。主要的思路是在未排序的部分中找到最小元素的索引,然后与当前位置的元素进行交换,通过不断进行这样的操作,实现整个数组的排序。

二、时空复杂度

时间复杂度:

直接排序算法的时间复杂度主要由两层循环决定。

外层循环:外层循环的次数是 n-1,其中 n是数组的长度。这是因为在进行 n-1次选择后,剩下的最后一个元素已经有序了。

内层循环:内层循环用于在未排序的部分中寻找最小元素的索引。在最坏情况下,每次选择都需要遍历剩余未排序的元素。内层循环的次数是n,n-1,n-2,…,1。其平均时间复杂度为O(n^2)

综合考虑外层和内层循环(只要考虑n的次数大的复杂度),直接排序的时间复杂度为O(n^2)

平均/最好/最差时间复杂度均为O(n^2)

空间复杂度:

直接排序是一种原地排序算法,它只需要常数级别的额外空间来存储少量的辅助变量,如循环中的索引和临时变量。因此,直接排序的空间复杂度为 O(1),即常数级别的额外空间。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用反射获取websocket,session字段的值

首先利用反射获取方法字段&#xff0c;然后取得字段的值 private static ConcurrentHashMap<String, Session> map new ConcurrentHashMap<>();OnOpenpublic void onOpen(Session session) throws IllegalAccessException {log.info(session.getId() "开始连…

Flask架构--路由和蓝图

学习视频&#xff1a;第二章&#xff1a;路由和蓝图 1 Flask查询路由的方式_哔哩哔哩_bilibili 参考&#xff1a;Flask框架之路由与蓝图的使用_flask 路由和蓝图-CSDN博客 1.路由的概念&#xff1a; 用于将http请求与特定的python函数相匹配。定义路由后&#xff0c;flask程…

模型索引:QModelIndex

一、为什么要使用模型索引&#xff1f; 从名字可以看出&#xff0c;他是模型的索引&#xff0c;只要对模型实体&#xff08;各种xxxModel的实体&#xff09;施加这个索引&#xff0c;model就会返回数据集中对应的值&#xff0c;或者通过这个索引修改对应数据集中的值。 类比数…

Java内容

目录 1.命名规范 1.命名规范 2.变量

懒得玩游戏--帮我做数独

目录 简介自动解数独思路核心思路输入解析打印 完整代码 简介 最近玩上了一款类似于数独的微信小程序游戏&#xff0c;名字叫数独趣味闯关&#xff0c;过了数独的关卡之后会给拼图&#xff0c;玩了几关之后摸清套路了就有点累了&#xff0c;但是还想集齐拼图&#xff0c;所以就…

【AUTOSAR】--01 AUTOSAR网络管理基础

AUTOSAR网络管理做了几个项目了&#xff0c;但发现还是有些理解不够深入的地方&#xff0c;最近趁着有个新项目也要做AUTOSAR网络管理&#xff0c;再从头梳理一下AUTOSAR网络管理&#xff0c;预计用2-3篇文章&#xff0c;把AUTOSAR网络重新梳理完成。 这是第一篇&#xff0c;主…

C //练习 4-13 编写一个递归版本的reverse(s)函数,以将字符串s倒置。

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-13 练习 4-13 编写一个递归版本的reverse(s)函数&#xff0c;以将字符串s倒置。 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要变更。 IDE工具&#xff1a;Visual S…

Element-Puls Form表单内嵌套el-table表格,根据表格复选框多选或单选动态设置行的验证规则

需求 根据 Table 表格内的复选框来控制当前选中行是否添加必填校验规则 效果图 实现思想 我们需要设置一个 flag 来标识已勾选的行&#xff0c;el-table渲染数据结构是数组对象形式&#xff0c;我们可以在每个对象中手动加如一个标识&#xff0c;例如默认&#xff1a;selected …

Windows环境 elasticsearch 及可视化界面 安装

安装 elastic 的官网 elastic.co/downloads/elasticsearch 当你解压好了归档文件之后&#xff0c;Elasticsearch 已经准备好运行了。按照下面的操作&#xff0c;在前台(foregroud)启动 Elasticsearch&#xff1a; cd elasticsearch-<version> ./bin/elasticsearch 如…

大型语言模型综述/总结 LLM A Survey of Large Language Models

A Survey of Large Language Model AbstractINTRODUCTIONOVERVIEW背景LLM的新兴能力LLM的关键技术GPT 系列模型的技术演进 大语言模型资源公开可用的模型检查点或 API常用语料库代码库资源 预训练数据收集架构 论文标题&#xff1a;A Survey of Large Language Model 论文地址&…

详谈Python的开发工具

Python作为一种流行的编程语言&#xff0c;在开发过程中需要使用各种工具来提高效率、简化工作流程和改善开发体验。在本文中&#xff0c;我们将介绍一些常用的Python开发工具&#xff0c;包括文本编辑器、集成开发环境&#xff08;IDE&#xff09;、虚拟环境管理工具、包管理器…

git常用命令集合及其演示

文章目录 一.git常用命令集合及其演示1.git config --list 查看配置信息2.git status 查看当前仓库的状态3.git add . 加到暂存区4.git commit -m "描述信息" 添加到版本库5.git diff xxxx 查看xxxx文件修改了哪些内容&#xff0c;相比于暂存区的区别6.git rm --cach…

PLSQL启动报错:Initialization error,不能初始化

出现场景&#xff1a;我这里原来有个旧版的PLSQL&#xff0c;想用新版的又装了个新版&#xff0c;启动的时候报错 解决办法 1.核对程序位数 第一个提示明显看到是和程序位数相关的&#xff0c;不管是32位还是64位要做到向匹配 2.设置oci.dll 第二个提示可以看到是和oci.dll…

03 Lombok+AOP思想+注解进化SqlSession工具类03

Lombok 实体类中除了定义好的属性外&#xff0c;我们常常还要写set/get构造方法等&#xff0c;用Lombok可以用一条注解帮忙生成。 一个Data会同时包含 Getter/Setter ToString EqualsAndHashCode RequiredArgsConstructor 使用方法&#xff1a;需要同时添加Lombok插件和Lombo…

【云原生】springboot 整合 OpenTelemetry

目录 一、前言 二、应用可观测性概述 2.1 什么是可观测性 2.2 可观测性三大指标 2.2.1 指标&#xff08;Metrics&#xff09; 2.2.2 日志&#xff08;log&#xff09; 2.2.3 追踪(Traces) 三、OpenTelemetry 介绍 3.1 什么是OpenTelemetry 3.2 OpenTelemetry架构和组件…

蓝桥杯省赛无忧 STL 课件17 map

01 map 02 multimap 03 unordered_map 04 代码示例

财务管理软件,用表格导出账目明细

不论是工资收入&#xff0c;还是日常花销&#xff0c;每一笔钱都需要我们认真对待。然而&#xff0c;许多人在财务管理上仍然采用传统的纸质记账方式&#xff0c;这不仅容易丢失数据&#xff0c;还难以实现财务的统一管理。为此&#xff0c;我为大家推荐一款简单好用的记账软件…

Java中对象的创建和使用

创建类 类体属性方法 public class Student{ Student是类&#xff0c;属于引用数据类型&#xff0c;这个类型名就是&#xff1a;student //属性【存储数据采用变量的形式】 //由于变量定义在类体当中&#xff0c;方法体之外&#xff0c;这种变量称为成员变量 //所有的学生都有…

高效构建Java应用:Maven入门和进阶(二)

高效构建Java应用&#xff1a;Maven入门和进阶&#xff08;二&#xff09; 二.基于IDEA的Maven的工程创建2.1 梳理Maven工程GAVP属性2.2 Idea构建Maven JavaSE工程2.3 Idea构建Maven JavaEE工程2.4 Maven工程项目结构说明 二.基于IDEA的Maven的工程创建 2.1 梳理Maven工程GAVP…

ppt怎么录屏录音并且导出?好用录屏软件推荐

ppt已经成为了日常工作与学习中必不可少的工具&#xff0c;而ppt屏幕录制功能&#xff0c;可以方便用户将他人的演讲或视频中的内容记录下来&#xff0c;以便进一步学习与研究。录制ppt演示并将其导出为视频文件&#xff0c;可以帮助我们进行分享&#xff0c;但是很多人不知道p…