【C语言-选择排序算法】实现对十个数进行排序

目录

前言

一、选择排序算法原理

二、选择排序算法实现对十个数进行排序

三、代码运行示例

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

五、选择排序算法的优缺点

六、总结


前言

        在计算机科学领域,排序算法是基石般的存在,它们就像是整理杂乱数据的魔法,让无序的数据变得井井有条。而选择排序(Selection Sort),作为一种简单直观的排序算法,在学习排序的道路上是我们绕不开的经典算法之一。今天,我们一起探讨如何使用 C 语言实现选择排序算法,对十个数字进行排序,并详细剖析其中的原理与细节。

一、选择排序算法原理

        选择排序的核心思想可以用 “挑最小的放前面” 来概括。它的执行过程就像是在一群学生中,先找出最矮的学生站到队伍最前面,然后在剩下的学生中再找出最矮的,依次类推,直到整个队伍按照身高从矮到高排列整齐。

        具体到数字排序上,在一个包含 n 个元素的数组中,选择排序会在每一轮遍历中,从待排序的元素中找出最小(或最大)的元素,将其与待排序序列的起始位置元素交换位置。每完成一轮遍历,就会有一个元素被放置到它最终的正确位置上,经过 n - 1 轮遍历后,整个数组就完成了排序。

        例如,对于数组[5, 3, 8, 6, 7],第一轮遍历会找出最小的元素3,将其与数组第一个元素5交换位置,得到[3, 5, 8, 6, 7];第二轮在剩余的[5, 8, 6, 7]中找出最小的5,由于它已经在正确位置,无需交换;第三轮在[8, 6, 7]中找出最小的6,与8交换,得到[3, 5, 6, 8, 7];第四轮在[8, 7]中找出最小的7,与8交换,最终得到有序数组[3, 5, 6, 7, 8] 。

二、选择排序算法实现对十个数进行排序

        在 C 语言中,我们可以通过以下代码实现选择排序算法对十个数字进行排序:

#include <stdio.h>// 选择排序函数
void selectionSort(int arr[], int n) {int i, j, min_index, temp;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;}}// 交换找到的最小元素和当前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}int main() {int numbers[10];printf("请输入十个整数:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的结果为:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}

代码详解:

选择排序函数selectionSort

void selectionSort(int arr[], int n) {int i, j, min_index, temp;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;}}// 交换找到的最小元素和当前位置元素temp = arr[min_index];arr[min_index] = arr[i];arr[i] = temp;}
}
  • 函数参数:arr是要排序的数组,n是数组的元素个数。
  • 外层循环:for (i = 0; i < n - 1; i++),控制排序的轮数。因为经过n - 1轮,就可以将n个元素全部放置到正确位置,所以循环次数为n - 1。
  • 内层循环:for (j = i + 1; j < n; j++),用于在每一轮中从 i + 1 位置开始遍历数组,找出剩余元素中的最小元素的下标,并将其存储在min_index中。在遍历过程中,通过 if (arr[j] < arr[min_index]) 比较元素大小,如果找到比当前最小元素更小的元素,就更新min_index。
  • 交换操作:找到最小元素的下标min_index后,通过中间变量temp将最小元素与当前位置(i位置)的元素进行交换,即:
temp = arr[min_index];
arr[min_index] = arr[i];
arr[i] = temp;

        这样就将当前轮找到的最小元素放置到了它应该在的位置上。

主函数main

int main() {int numbers[10];printf("请输入十个整数:\n");for (int i = 0; i < 10; i++) {scanf("%d", &numbers[i]);}selectionSort(numbers, 10);printf("排序后的结果为:\n");for (int i = 0; i < 10; i++) {printf("%d ", numbers[i]);}printf("\n");return 0;
}
  • 首先定义一个长度为 10 的整型数组numbers,用于存储用户输入的十个数字。
  • 通过for循环和scanf函数,提示用户输入十个整数,并将输入的数字依次存储到数组numbers中。
  • 调用selectionSort函数对numbers数组进行排序,传入数组名和数组元素个数 10。
  • 最后再通过一个for循环和printf函数,将排序后的数组元素依次输出,展示排序结果。

三、代码运行示例

        假设我们输入十个数字:9 5 2 7 1 8 3 6 4 0,程序运行后,会输出排序后的结果:0 1 2 3 4 5 6 7 8 9 。每一个数字都按照从小到大的顺序被正确排列,这正是选择排序算法发挥作用的结果。

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

时间复杂度

        选择排序的时间复杂度主要取决于两层嵌套循环。外层循环执行 n - 1 次,内层循环在第i次外层循环时执行 n - i 次。总的比较次数为(n - 1) + (n - 2) +... + 1 = n * (n - 1) / 2,所以选择排序的时间复杂度为O(n^2),其中n是数组元素的个数。这意味着,随着数组规模的增大,选择排序所需的时间会呈平方级增长,在处理大规模数据时效率较低。

空间复杂度

        在选择排序过程中,除了原数组外,只使用了几个额外的变量(如min_index、temp等)来辅助排序,这些变量所占用的空间是固定的,不随数组规模的变化而变化。因此,选择排序的空间复杂度为O(1),属于原地排序算法,不需要额外开辟大量的内存空间。

五、选择排序算法的优缺点

优点:

  • 简单直观:选择排序的原理和实现都非常简单,对于初学者来说,很容易理解和掌握,是学习排序算法的良好入门选择。​
  • 稳定且原地排序:在不考虑相等元素交换的情况下,选择排序是一种稳定的排序算法(如果在比较时遇到相等元素不交换位置,就能保证相等元素的相对顺序不变)。并且它不需要额外的大量内存空间,只需要几个辅助变量,空间复杂度低,适合在内存资源有限的环境下使用。​

缺点:​

  • 效率较低:由于其时间复杂度为O(n^2),在处理大规模数据时,排序所需的时间会急剧增加,相比一些高效的排序算法(如快速排序、归并排序等),性能较差。​
  • 交换次数较多:在选择排序过程中,即使数据已经部分有序,它仍然会按照固定的方式进行比较和交换操作,没有利用数据已有的有序性,这也是导致其效率低下的一个原因。

六、总结

        通过以上详细的讲解和代码实现,我们深入了解了选择排序算法,并成功使用 C 语言对十个数字进行了排序。选择排序虽然在处理大规模数据时效率不高,但它简单易懂的特性使其成为学习排序算法的重要基础。同时,通过对选择排序的学习,我们也对 C 语言数组的操作、循环结构以及函数的使用有了更深入的理解。在实际编程中,我们可以根据具体的数据规模和需求,选择合适的排序算法来提高程序的性能和效率。希望本文能帮助大家更好地掌握选择排序算法。

        如果你对选择排序算法还有其他疑问或文章中有不对的地方,欢迎交流指正!

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

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

相关文章

配置Intel Realsense D405驱动与ROS包

配置sdk使用 Ubuntu20.04LTS下安装Intel Realsense D435i驱动与ROS包_realsense的驱动包-CSDN博客 中的方法一 之后不通过apt安装包&#xff0c;使用官方的安装步骤直接clone https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy 从这一步开始 执行完 这一步…

基于SpringBoot的中华诗词文化分享平台-项目分享

基于SpringBoot的中华诗词文化分享平台-项目分享 项目介绍项目摘要管理员功能图会员功能图系统功能图项目预览会员主页面诗词页面发布问题回复评论 最后 项目介绍 使用者&#xff1a;管理员、会员 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 本文旨在设计与实现一…

ProxySQL 性能调优工具推荐

ProxySQL 的性能优化需结合‌实时监控工具‌与‌自动化分析平台‌,以下为常用工具分类与推荐: 一、‌内置诊断工具‌ ProxySQL Admin 接口‌ 通过内置管理表直接分析性能数据: sql Copy Code SELECT * FROM stats_mysql_query_digest; – 高频查询分析(执行次数、平均耗…

unity TEngine学习记录3

上一篇讲了怎么使用te框架&#xff0c;本篇主要学习的是UI&#xff0c;一个游戏百分之70%都是UI的展示效果&#xff0c;现在让我们继续打开te官网找到UI部分继续学习。 ui创建以及加载 我们根据文档首先打开命名规则界面,大家第一次看就知道这个是干啥的&#xff0c;你想使用此…

23种设计模式-创建型模式之单例模式(Java版本)

Java 单例模式&#xff08;Singleton Pattern&#xff09;详解 &#x1f31f; 什么是单例模式&#xff1f; 单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问它。 &#x1f9e0; 使用场景 配置管理类&#xff08;如读取配置文件&#xff09;日志工具类…

2025能源网络安全大赛CTF --- Crypto wp

文章目录 前言simpleSigninNumberTheory 前言 大半年以来写的第一篇文章&#xff01;&#xff01;&#xff01; simpleSignin 题目&#xff1a; from Crypto.Util.number import * from gmpy2 import * import osflag bxxx p next_prime(bytes_to_long(os.urandom(128))…

加密与解密完全指南,使用Java实现

文章目录 1. 加密基础知识1.1 什么是加密&#xff1f;1.2 加密的历史简介1.2.1 古典加密1.2.2 现代加密的起源 1.3 加密的基本概念1.3.1 密码学中的关键术语1.3.2 加密的基本原则 1.4 加密的分类1.4.1 对称加密&#xff08;Symmetric Encryption&#xff09;1.4.2 非对称加密&a…

十一、数据库day03--SQL语句02

文章目录 一、查询语句1. 基本查询2. 条件查询2.1 ⽐较运算符&逻辑运算符2.2 模糊查询2.3 范围查询2.4 判断空 3. 其他复杂查询3.1 排序3.2 聚合函数3.3 分组3.4 分页查询 二、回顾1. 使⽤ Navicat ⼯具中的命令列2.命令⾏基本操作步骤 提示&#xff1a;以下是本篇文章正文…

Flowable 与 bpmn.io@7.0 完整集成示例 Demo

Flowable 与 bpmn.io7.0 完整集成示例 Demo 下面是一个完整的前后端集成示例&#xff0c;包含前端使用 bpmn.js 7.0 和与 Flowable 后端交互的实现。 1. 后端实现 (Spring Boot Flowable) 1.1 添加依赖 (pom.xml) <dependencies><!-- Spring Boot --><depe…

ROS2 安装详细教程,Ubuntu 22.04.5 LTS 64 位 操作系统

一、完整安装流程&#xff08;推荐&#xff09; 1. 安装依赖工具 sudo apt update && sudo apt install -y software-properties-common curl gnupg2 2. 添加 ROS 2 GPG 密钥 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /…

STM32 基本GPIO控制

目录 GPIO基础知识 ​编辑IO八种工作模式 固件库实现LED点灯 蜂鸣器 按键基础知识 ​编辑继电器 震动传感器 433M无线模块 GPIO基础知识 GPIO(General-Purpose input/output,通用输入/输出接口) 用于感知外部信号&#xff08;输入模式&#xff09;和控制外部设备&…

14.Chromium指纹浏览器开发教程之WebGL指纹定制

WebGL指纹概述 当在浏览器打开的网页上浏览内容时&#xff0c;看到的大多是平面的、静态的图像和文字。但是有时想要在网页上看到更加生动、立体的图像&#xff0c;如3D游戏、虚拟现实应用等。这时&#xff0c;就需要用到WebGL。 简单来说&#xff0c;WebGL&#xff08;Web G…

C# foreach 循环中获取索引的完整方案

一、手动维护索引变量 ‌实现方式‌&#xff1a; 在循环外部声明索引变量&#xff0c;每次迭代手动递增&#xff1a; int index 0; foreach (var item in collection) { Console.WriteLine($"{index}: {item}"); index; } ‌特点‌&#xff1a; 简单直接&#…

Android 下拉栏中的禁用摄像头和麦克风隐藏

Android 下拉栏中的禁用摄像头和麦克风隐藏 文章目录 Android 下拉栏中的禁用摄像头和麦克风隐藏一、前言二、下拉框中的禁用摄像头和麦克风隐藏实现1、设置支持属性为false2、修改代码 三、其他1、下拉栏中的禁用摄像头和麦克风隐藏小结2、 Android SensorPrivacyService ps&a…

数字后端设计 (四):时钟树综合——让芯片的「心跳」同步到每个角落

—— 试想全城的人要在同一秒按下开关——如果有的表快、有的表慢&#xff0c;结果会乱套&#xff01;时钟树综合就是给芯片内部装一套精准的“广播对时系统”&#xff0c;让所有电路踩着同一个节拍工作。 1. 为什么时钟如此重要&#xff1f; 芯片的「心跳」&#xff1a;时钟信…

华为网路设备学习-19 路由策略

一、 二、 注意&#xff1a; 当该节点匹配模式为permit下时&#xff0c;参考if else 当该节点匹配模式为deny下时&#xff1a; 1、该节点中的apply子语句不会执行。 2、如果满足所有判断&#xff08;if-match&#xff09;条件时&#xff0c;拒绝该节点并跳出&#xff08;即不…

机器学习决策树

一、何为决策树 决策树&#xff08;Decision Tree&#xff09;是一种分类和回归方法&#xff0c;是基于各种情况发生的所需条件构成决策树&#xff0c;以实现期望最大化的一种图解法。由于这种决策分支画成图形很像一棵树的枝干&#xff0c;故称决策树。它的运行机制非常通俗易…

香港服务器CPU对比:Intel E3与E5系列核心区别与使用场景

香港服务器的 CPU 配置(核心数与主频)直接决定了其并发处理能力和数据运算效率&#xff0c;例如高频多核处理器可显著提升多线程任务响应速度。在实际业务场景中&#xff0c;不同负载需求对 CPU 架构的要求存在显著差异——以 Intel E3 和 E5 系列为例&#xff0c;由于两者在性…

【Rust 精进之路之第8篇-工具赋能】深入 Cargo:依赖管理、构建配置与工作空间 (Workspace)

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:超越构建,Cargo 是 Rust 生态的引擎 在我们的 Rust 学习之旅初期(第二篇),我们已经与 Cargo 有过初步的接触。我们学会了使用 cargo new 创建项目骨架,用 cargo build 编…

#systemverilog# 进程控制问题#(八)关于#0 问题的使用(三)

今天,我们继续研究一下上一节讨论的问题。其实,还有一个小问题,我们来探讨一下。 `timescale 1ns/10psmodule tb_top(); reg clk; reg reset;initial begin reset = 0; #10 reset = 1; #15 reset = 0; #50 $finish; endinitial beginfor(int i = 0; i < 4 ; i++)fork #…