如何在 C 语言中进行选择排序?

C语言

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。

分割线

文章目录

  • 如何在 C 语言中进行选择排序
  • 一、选择排序的基本思想
  • 二、选择排序的算法步骤
  • 三、选择排序的 C 语言实现
  • 四、选择排序的时间复杂度和空间复杂度分析
    • (一)时间复杂度
    • (二)空间复杂度
  • 五、选择排序的稳定性
  • 六、选择排序的适用场景
  • 七、选择排序与其他排序算法的比较
    • (一)与冒泡排序的比较
    • (二)与插入排序的比较
    • (三)与快速排序的比较
  • 八、示例分析
  • 九、优化思路
    • (一)减少交换次数
    • (二)利用已排序部分的信息
  • 十、总结

分割线


如何在 C 语言中进行选择排序

选择排序(Selection Sort)是一种简单直观的排序算法。它首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

分割线

一、选择排序的基本思想

  1. 遍历整个数组,找出最小的元素。
  2. 将最小的元素与数组的第一个元素交换位置。
  3. 在剩余的未排序元素中重复上述步骤,直到整个数组都被排序。

分割线

二、选择排序的算法步骤

以下是选择排序的详细步骤:

假设要对数组 arr[] 进行排序,数组的长度为 n

  1. 从数组的第一个元素开始,即 i = 0
  2. 对于每个 i,从 i + 1n - 1 中找到最小的元素,并记录其索引 min_index
  3. 如果 min_index 不等于 i,则交换 arr[i]arr[min_index]
  4. 增加 i,重复步骤 2 和 3,直到 i = n - 2

分割线

三、选择排序的 C 语言实现

#include <stdio.h>// 交换两个元素的值
void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_index;for (i = 0; i < n - 1; i++) {min_index = i;for (j = i + 1; j < n; j++)if (arr[j] < arr[min_index])min_index = j;if (min_index!= i)swap(&arr[i], &arr[min_index]);}
}// 打印数组函数
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("排序前的数组为: ");printArray(arr, n);selectionSort(arr, n);printf("排序后的数组为: ");printArray(arr, n);return 0;
}

在上述代码中,我们首先定义了一个 swap 函数用于交换两个元素的值。

selectionSort 函数实现了选择排序的逻辑。外层循环控制排序的轮数,内层循环用于在每一轮中找到最小的元素。

printArray 函数用于打印数组的元素。

main 函数中,我们创建了一个待排序的数组,并调用相应的函数进行排序和打印。

分割线

四、选择排序的时间复杂度和空间复杂度分析

(一)时间复杂度

选择排序的平均时间复杂度和最坏时间复杂度都为 O(n^2)。这是因为无论数组的初始状态如何,对于每个元素都需要进行比较和交换操作,总共需要进行 n - 1 轮比较和交换,每一轮比较和交换的操作数量都与数组的长度 n 成正比。

(二)空间复杂度

选择排序的空间复杂度为 O(1)。因为它只在交换元素时使用了固定的额外空间,而不需要额外的数组或其他数据结构来存储数据。

分割线

五、选择排序的稳定性

选择排序是一种不稳定的排序算法。这是因为在选择最小元素并与当前位置交换时,如果有两个相同的元素,它们的相对顺序可能会发生改变。

例如,对于数组 [5, 5', 2],第一次选择最小元素 2 并与第一个位置的 5 交换,得到 [2, 5', 5],两个 5 的相对顺序发生了变化。

分割线

六、选择排序的适用场景

选择排序适用于小型数据集或者对算法的简单性要求较高的场景。由于其时间复杂度较高,在处理大型数据集时,性能通常不如其他更高效的排序算法,如快速排序、归并排序等。

分割线

七、选择排序与其他排序算法的比较

(一)与冒泡排序的比较

选择排序和冒泡排序都是简单的排序算法,它们的时间复杂度都为 O(n^2)。然而,在每一轮的操作中,冒泡排序需要进行多次相邻元素的比较和交换,而选择排序只需要进行一次最小元素的选择和交换。因此,在通常情况下,选择排序的性能略优于冒泡排序。

(二)与插入排序的比较

插入排序在对于近乎有序的数组时,性能较好,其平均时间复杂度可以接近 O(n)。而选择排序无论数组的初始状态如何,时间复杂度都为 O(n^2)。因此,在数组近乎有序的情况下,插入排序更优。

(三)与快速排序的比较

快速排序的平均时间复杂度为 O(nlogn),是一种效率很高的排序算法。与选择排序相比,快速排序在处理大型数据集时具有明显的优势。

分割线

八、示例分析

让我们通过一个具体的示例来详细分析选择排序的过程。

假设有数组 [9, 5, 7, 2, 6]

第一轮:

  • 初始状态:[9, 5, 7, 2, 6]
  • 首先假设第一个元素 9 是最小的,然后从第二个元素开始比较。
  • 经过比较,发现 2 是最小的,所以将 29 交换位置。
  • 第一轮结束后,数组变为 [2, 5, 7, 9, 6]

第二轮:

  • 此时从第二个元素开始,假设 5 是最小的。
  • 比较剩余元素,发现没有比 5 更小的,所以位置不变。
  • 第二轮结束后,数组仍为 [2, 5, 7, 9, 6]

第三轮:

  • 从第三个元素开始,假设 7 是最小的。
  • 比较剩余元素,发现 6 更小,所以将 67 交换位置。
  • 第三轮结束后,数组变为 [2, 5, 6, 9, 7]

第四轮:

  • 从第四个元素开始,假设 9 是最小的。
  • 比较剩余元素,发现 7 更小,所以将 79 交换位置。
  • 第四轮结束后,数组变为 [2, 5, 6, 7, 9],排序完成。

通过这个示例,我们可以清晰地看到选择排序每一轮的操作过程以及如何逐步将数组排序。

分割线

九、优化思路

虽然选择排序的基本算法已经比较简单直接,但在某些情况下,仍然可以考虑一些优化思路:

(一)减少交换次数

在找到最小元素的索引后,先不立即进行交换,而是在一轮比较结束后,如果最小元素的索引与当前位置不同,再进行一次交换。这样可以在一定程度上减少交换的次数,特别是在数组中元素重复较多的情况下。

(二)利用已排序部分的信息

在后续的轮次中,可以利用已经排序好的部分,缩小搜索最小元素的范围。但这种优化在选择排序中效果可能不太显著,因为选择排序的核心思想是每次选择未排序部分的最小元素。

分割线

十、总结

选择排序是一种简单但效率相对较低的排序算法。它的优点是实现简单,易于理解,空间复杂度低。缺点是时间复杂度较高,在处理大规模数据时性能不佳。在实际应用中,应根据具体情况选择合适的排序算法。如果数据量较小,或者对算法的简单性要求较高,选择排序可以是一个可行的选择。但对于大规模数据的排序,通常会优先考虑更高效的排序算法,如快速排序、归并排序等。


分割线

🎉相关推荐

  • 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。
  • 🍅博客首页-关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!
  • 📙CSDN专栏-C语言修炼
  • 📙技术社区-墨松科技

分割线



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

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

相关文章

B站大课堂-自动化精品视频(个人存档)

基础知识 工业通信协议 Modbus 施耐德研发&#xff0c;有基于以太网的 ModbusTCP 协议和使用 485/232 串口通信的 ModbusRTU/ASCII。 Modbus 协议面世较早、协议简洁高效、商用免费、功能灵活、实现简单&#xff0c;是目前应用最广泛的现场总线协议。 我的笔记里边有一些推荐…

本地开发微信小程序,使用巴比达内网穿透

在微信小程序开发的热潮中&#xff0c;开发者常面临的一个挑战是如何在复杂的网络环境下测试和调试内网环境中的服务。巴比达正为这一难题提供了一条解决方案&#xff0c;极大简化了微信小程序与内网服务器之间通信的流程&#xff0c;加速了开发迭代周期。 以往&#xff0c;开…

关于力反馈设备应用方向的探讨

力反馈是在虚拟现实 (VR)等模拟环境中通过机动运动或阻力模拟真实世界的物理触觉。大多数人都是通过视频游戏控制器&#xff08;如方向盘或踏板&#xff09;和其他设备&#xff08;如飞行模拟器操纵杆&#xff09;来了解力反馈效果。但我们都知道该技术的用途远不止于游戏。 触…

Golang语法规范和风格指南(一)——简单指南

1. 前引 一个语言的规范的学习是重要的&#xff0c;直接关系到你的代码是否易于维护和理解&#xff0c;同时学习好对应的语言规范可以在前期学习阶段有效规避该语言语法和未知编程风格的冲突。 这里是 Google 提供的规范&#xff0c;有助于大家在开始学习阶段对 Golang 进行一…

基于 BERT 的非结构化领域文本知识抽取

文章目录 题目摘要方法实验 题目 食品测试的大型语言模型 论文地址&#xff1a;https://arxiv.org/abs/2103.00728 摘要 随着知识图谱技术的发展和商业应用的普及&#xff0c;从各类非结构化领域文本中提取出知识图谱实体及关系数据的需求日益增加。这使得针对领域文本的自动化…

【UE5】调用ASR接口,录制系统输出。录制音频采样率不匹配

暂时测出window能用。阿里的ASR接口当前仅支持8000和16000。UE默认采样44100。

MES系统助力塑料制品行业数字化转型

注塑MES系统助力工厂生产力提升具体体现在&#xff1a;覆盖生产全流程&#xff1b;数据自动收集、科学规划排产&#xff1b;优化配送模型、平衡物流运转&#xff1b;严格把控品质、异常自动分析&#xff1b;实时监控设备&#xff0c;保证正常运转&#xff1b;产品快速追溯&…

教学神器大比拼:SmartEDA、Multisim、Proteus,谁是你的最佳选择?

随着科技的飞速发展&#xff0c;教学工具也在不断升级。在电子设计自动化&#xff08;EDA&#xff09;和电路仿真领域&#xff0c;SmartEDA、Multisim和Proteus三款软件备受关注。那么&#xff0c;对于广大教育工作者和学生们来说&#xff0c;这三者之间该如何选择呢&#xff1…

AI绘画之儿童绘本制作变现途径(附详细教程)

AI技术飞速发展&#xff0c;创作儿童绘本或是故事书已经不再是专业插画师和作家的专利。在AI技术的介入下&#xff0c;为那些有创意但缺乏绘画技巧的人们打开了一扇新的大门。通过AI工具&#xff0c;我们可以轻松地创作出既有趣又富有教育意义的儿童故事书&#xff0c;并通过多…

LLMs可以进行任务规划吗?如果不行,LLMs+GNN可以吗?

深度图学习与大模型LLM(小编): 大家好,今天向大家介绍一篇最新发布的研究论文&#xff08;20240530&#xff09;。这篇论文探讨了如何通过引入GNN来提高大模型在任务规划(task planning)中的性能。*论文分析了LLMs在任务规划上的局限性,并提出了一种简单而有效的解决方案。* 1.…

@RequiredArgsConstructor实现构造器注入

RequiredArgsConstructor实现构造器注入 1. Autowired 和 Resource 注解 Autowired Autowired 是 Spring 框架提供的注解&#xff0c;用于自动装配依赖。可以用于字段、构造函数和 setter 方法。 Autowired private ISysUserService userService;Resource Resource 是 Jav…

python接口自动化(二十一)--unittest简介(详解)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 简介 前边的随笔主要介绍的requests模块的有关知识个内容&#xff0c;接下来看一下python的单元测试框架unittest。熟悉 或者了解java 的小伙伴应该都清楚常见的单元测试框架 Junit 和…

广州旭之源模块电源PIN TO PIN替换金升阳

广州旭之源科技有限公司&#xff0c;创立ATAZ工业电源品牌&#xff0c;是一家集研发、生产、销售和服务于一体的标准工业电源解决方案提供商。 以电力电子和自动化控制为核心技术&#xff0c;产品涵盖了壳架式、模块式、导轨式等工业电源。所生产的产品广泛应用于工业控制、电力…

AIGC产品经理学习路径

基础篇&#xff08;课时 2 &#xff09; AIGC 行业视角 AIGC 的行业发展演进&#xff1a;传统模型/深度学习/大模型 AIGC 的产品设计演进&#xff1a;AI Embedded / AI Copilot / AI Agen AIGC 的行业产业全景图 AIGC 的产品应用全景图 AIGC 职业视角 AI 产品经理/ AIGC…

vue3中antd上传图片组件及回显

实现效果&#xff1a; 调用后端接口后&#xff0c;后端返回的数据&#xff1a; 1.在项目components/base下新建UploadNew.vue文件&#xff08;上传图片公共组件&#xff09; <template><div class"clearfix"><a-uploadv-model:file-list"fileL…

视频汇聚平台EasyCVR设备录像回看请求播放时间和实际时间对不上,是何原因?

安防监控EasyCVR视频汇聚平台可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时监控、云端录像、回看、告警、平台级联以及多视频流格式分发等视…

【自监督学习】DINO in ICCV 2021

一、引言 论文&#xff1a; DINO: Emerging Properties in Self-Supervised Vision Transformers 作者&#xff1a; Facebook AI Research 代码&#xff1a; DINO 特点&#xff1a; 对于一张图片&#xff0c;该方法首先进行全局和局部的裁剪与增强并分别送入教师和学生网络&am…

关于.NETCORE站点程序部署到nginx上无法访问静态文件和无法正确生成文件的问题解决过程。

我的netcore6项目&#xff0c;部署到IIS的时候&#xff0c;生成报告时&#xff0c;需要获取公司LOGO图片放到PDF报告文件中&#xff0c;这时候访问静态图片没有问题。 然后还有生成邀请二维码图片&#xff0c;这时候动态创建图片路径和图片也没有问题&#xff0c;可以在站点的…

本地部署:Real-ESRGAN: 高效的图像超分辨率解决方案

目录 引言 什么是 Real-ESRGAN Real-ESRGAN 的特点 工作原理 应用场景 本地部署 本地运行 实验与结果 未来发展方向 结语 Tip&#xff1a; 引言 图像超分辨率&#xff08;Super-Resolution, SR&#xff09;技术旨在从低分辨率图像生成高分辨率图像&#xff0c;应用…

初学SpringMVC之 RestFul 风格、重定向和转发

RestFul 风格改变 URL 形式 比如之前是&#xff1a;http://localhost:8080/add?a1&b2 现在是&#xff1a;http://localhost:8080/add/a/b&#xff08;全是斜杠&#xff09; package com.demo.controller;import org.springframework.stereotype.Controller; import org…