如何在 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.mzph.cn/pingmian/44896.shtml

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

相关文章

【Python】已解决:AttributeError: target_names(机器学习中查看数据信息报错)

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;AttributeError: target_names&#xff08;机器学习中查看数据信息报错&#xff09; 一、分析问题背景 在机器学习的数据处理阶段&#xff0c;我们经常需要查看…

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包

使用pip或conda离线下载安装包&#xff0c;使用pip或conda安装离线安装包 一、使用pip离线下载安装包1. 在有网络的机器上下载包和依赖2. 传输离线安装包 二、在目标机器上离线安装pip包三、使用conda离线下载安装包1. 在有网络的机器上下载conda包2. 传输conda包或环境包3. 在…

每日一练 - 理解IGMP组播组信息

下面是路由器 RTB 的部分输出信息&#xff0c; 关于输出信息描述错误的是A.接口上动态加入的组播组个数是 1 B.加入的组播组地址是 225.1.1.2 C.dsplay igmp group 命令用来查看 IGMP 组播组信息,包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组信息 D.最后发…

汇编语言 第四版 王爽 一二章总结

第一章 基础知识 汇编语言的三类指令 1. 汇编指令 汇编指令是直接被CPU执行的指令&#xff0c;它们在汇编时被转换为对应的机器码。主要包括&#xff1a; 数据传送指令&#xff1a;如MOV&#xff0c;用于在寄存器、内存和I/O端口之间传送数据。 MOV AX, BX ; 将BX中的数据传…

【手把手教你使用cgroup配置,十分钟就会】

手把手教你使用cgroup配置&#xff0c;十分钟就会 什么是cgroupcgroup中的参数概念及原理 以 memory为例看下如何配置配置内存限制写一个内存申请脚本执行脚本测试结束语 什么是cgroup cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制&#xff0c…

postgres 的dblink使用,远程连接数据库

一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行&#xff0c;查询数据 其中&#xff0c;第一个参数是dblink名字&#xff0c;也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…

“学习Pandas中时间序列的基本操作“

目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…

算法训练营day28--134. 加油站 +135. 分发糖果+860.柠檬水找零+406.根据身高重建队列

一、 134. 加油站 题目链接&#xff1a;https://leetcode.cn/problems/gas-station/ 文章讲解&#xff1a;https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1jA411r7WX 1.1 初见思路 得模拟分析出…

如何抓取和处理天气网站数据

目的 在进行气象研究时&#xff0c;获取准确的历史天气数据是至关重要的。本文将分享如何从天气网站收集数据并将其转化为表格形式&#xff0c;以便于后续分析。然而&#xff0c;在直接抓取数据时&#xff0c;可能会遇到API接口保护的问题。本文将详细解释解决这些问题的步骤&…

“Pandas数据处理与分析:实用技巧与应用“

目录 # 开篇 1. pandas的series的了解 1.1 pd.Series 创建 1.2 pd.series 的索引使用 1.3 pd.series 之字典/索引 1.4 pandas 转换数据类型 1.5 pandas 通过索引或者通过位置来取值 1.6 pandas 指定行取值 1.7 pands之Series 切片和索引 1.8 pands之Series 的索引和值…

Python基础教学之三:函数与模块篇——实现代码重用和模块化

Python基础教学之三&#xff1a;函数与模块篇——实现代码重用和模块化 一、函数的定义与使用 1. 理解函数 函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块。它可以提高代码的重用性和程序的清晰度。 你可以定义一个由自己想要功能的函数&#xff0c;以下是…

交易伦敦银系统,听说高手都有一套

成功的伦敦银交易者都有一套自己的交易系统&#xff0c;这个系统为他们提供了一个明确的、可重复的决策框架&#xff0c;无论白银市场如何波动&#xff0c;他们都能按照既定的规则和策略进行操作&#xff0c;避免了情绪化决策和随意交易——这样的一致性有助于减少错误和亏损&a…

Androd 12 (MTK)修改屏幕物理分辨率Physical Size

1.需求说明 Android目前显示分辨率为480*800&#xff0c;立项表中像素为720*1280。请修改屏幕分辨率到指定大小。 2.思路分析 如果从手机修改对应的分辨率&#xff0c;必须自上而下的进行修改分为两个层面进行修改。 1.驱动底层 2.软件上层 3.结局方法与相关说明 查看当…

安全防御---防火墙实验1

安全防御—防火墙实验1 一、实验拓扑与要求 要求&#xff1a; 1、DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00-18:00)可以访问&#xff0c;生产区的设备全天可以访问 2、生产区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 …

企业注册商标步骤

企业注册商标&#xff1a;详细步骤与关键要点 在当今商业环境中&#xff0c;商标已成为企业品牌建设和市场竞争中不可或缺的一部分。它不仅是企业身份的象征&#xff0c;也是企业知识产权的重要组成部分。 一、确定注册商标的商品项目 首先&#xff0c;企业需要明确需要注册商…

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…

Go语言---文件分类、设备文件、磁盘文件、实现打开/写/读/关闭/拷贝文件

设备文件: 屏幕(标准输出设备) fmt.Println()往标准输出设备写内容 键盘(标准输入设备) fmt.Scan()从标准输入设备读取内容 磁盘文件&#xff0c;放在存储设备上的文件 文本文件&#xff1a;以记事本打开&#xff0c;能看到内容(不是乱码) 二进制文件&#xff1a;以记事本打开…

微信右上角的“+”号,竟然能做这些事?90%的人不知道

微信&#xff0c;作为一款集社交、支付、娱乐于一体的超级应用&#xff0c;它的每一次更新都吸引着亿万用户的目光。 在微信的众多功能中&#xff0c;右上角的""号图标看似普通&#xff0c;实则隐藏着许多不为人知的实用技巧。本文将从四个方面深入挖掘这些隐秘功能…

打包时提示:Missing Gradle Project Information.或者在加载gradle时出错

1.Android打包弹出错误提示框&#xff1a;missing gradle project information. please check if the IDE successfully synchronized its state with the Gradble project model. 2.加载gradle出错&#xff1a;修复报错后 File -> Sync Project with Gradle Files

用JavaScript将 NCR(Numeric Character Reference)标记转换为对应字符的方法

0 &#xff0c 、&#11111……是什么鬼&#xff1f; 最近&#xff0c;要将一些网页内容复制到<textarea>文本框中作进一步处理&#xff0c;发现有些网页内容中包含&#xff0c或之类的标记&#xff0c;会被原样复制到<textarea>文本框中。 如果将这些网页内容直…