C语言第九周课——经典算法

目录

一、冒泡法排序

1.1原理

1.2代码实现(以升序排序为例) 

1.3逻辑 

1.4分析

二、二分法查找

2.1原理

2.2代码实现 

2.3逻辑

2.4算法效率分析

三、素数判断

3.1原理

3.2代码实现

3.3逻辑

3.4分析


一、冒泡法排序

1.1原理

  • 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
  • 这个算法的名字由来是因为越小的元素会经由交换慢慢 “浮” 到数列的顶端(升序排序的情况下),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样。

1.2代码实现(以升序排序为例) 

#include<stdio.h>
// 定义数组长度
#define SIZE 3
int main()
{int arr[SIZE];int i;// 从控制台输入数字到数组printf("请输入%d个整数:\n", SIZE);for (i = 0; i < SIZE; i++){scanf("%d", &arr[i]);}int n = SIZE;int h, j, temp;for (h = 0; h < n - 1; h++){for (j = 0; j < n - h - 1; j++){if (arr[j] > arr[j + 1]){// 交换元素temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}// 输出排序后的数组printf("排序后的数组为:\n");for (i = 0; i < SIZE; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

1.3逻辑 

在这段代码中:

 
  • main函数里,首先通过循环和scanf函数从控制台接收用户输入的数字,并存储到数组arr中。
  • 然后通过两层循环来对输入的数组进行冒泡排序。
  • 最后再通过循环将排序后的数组元素输出到控制台。

1.4分析

  1. 时间复杂度分析
    • 最好情况:当输入的数组已经是有序的情况下,冒泡排序只需要进行一轮比较,没有元素交换操作。此时时间复杂度为,其中n是数组的长度。
    • 最坏情况:当输入的数组是逆序的情况下,需要进行n-1轮比较,每一轮比较的次数逐渐减少,总的比较次数是,时间复杂度为。
    • 平均情况:时间复杂度也是,因为在平均情况下,数组元素的无序程度介于最好情况和最坏情况之间。
  2. 空间复杂度分析
    • 冒泡排序是一种就地排序算法,它只需要一个额外的临时变量temp来交换元素的位置,所以空间复杂度为。这意味着它在排序过程中不需要额外的大量存储空间,只需要对原始数组进行操作即可。

二、二分法查找

2.1原理

二分查找(Binary Search),也叫折半查找,是一种在有序数组中查找特定元素的高效算法。它的基本思想是:

 
  • 每次比较中间元素与目标元素的值。
  • 如果中间元素的值等于目标元素的值,那么就找到了目标元素,查找结束。
  • 如果中间元素的值大于目标元素的值(因为是降序数组),则目标元素可能在数组的左半部分,所以下一次查找在左半部分继续进行。
  • 如果中间元素的值小于目标元素的值,则目标元素可能在数组的右半部分,下一次查找就在右半部分继续进行。
 

通过不断地将查找范围缩小一半,直到找到目标元素或者确定目标元素不存在为止。

2.2代码实现 

#include <stdio.h>
// 定义数组长度
#define SIZE 10
int main()
{int arr[SIZE] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};int target;// 从控制台输入要查找的目标数字printf("请输入要查找的数字:\n");scanf("%d", &target);int left = 0;int right = SIZE - 1;int result = -1; // 先假设未找到,赋值为 -1while (left <= right){// 计算中间元素的索引int mid = left + (right - left) / 2;if (arr[mid] == target){result = mid;break; // 找到目标元素,退出循环}else if (arr[mid] < target){right = mid - 1;}else{left = mid + 1;}}if (result!= -1){printf("目标数字 %d 在数组中的索引为 %d\n", target, result);}else{printf("未找到目标数字 %d\n", target);}return 0;
}

2.3逻辑

① 头文件包含

这行代码引入了标准输入输出头文件stdio.h,使得程序能够使用printfscanf等函数来进行控制台的输入输出操作。

②数组定义与初始化

  • 首先通过#define指令定义了一个常量SIZE来表示数组的长度,这里设置为10

  • main函数内部,定义并初始化了一个名为arr的整数数组,数组元素按照降序排列,从101。这个数组是后续进行二分查找的对象。

③目标数字输入

  • 定义了一个整型变量target,用于存储用户从控制台输入的要查找的目标数字。

  • 通过printf函数输出提示信息,引导用户输入数字,然后使用scanf函数从控制台读取用户输入的整数,并将其存储到target变量中。

④二分查找逻辑

  • 首先初始化了三个整型变量:

    • left:用于表示查找范围的左边界,初始化为0,即数组的起始索引。

    • right:表示查找范围的右边界,初始化为SIZE - 1,也就是数组的最后一个元素的索引。

    • result:用于存储最终查找结果的索引,初始化为-1,表示先假设目标数字未找到。

  • 然后进入一个while循环,只要left小于等于right,就说明查找范围还有效,继续进行查找操作:

    • 在每次循环中,先通过公式mid = left + (right - left) / 2计算出当前查找范围的中间元素的索引mid。这个公式的目的是为了避免整数溢出问题(相比于直接使用(left + right) / 2)。

    • 接着通过if - else if - else语句来比较中间元素arr[mid]与目标元素target的大小关系:

      • 如果arr[mid]等于target,说明找到了目标元素,将mid赋值给result,并通过break语句退出循环。

      • 如果arr[mid]小于target,由于数组是降序排列的,所以目标元素应该在当前中间元素的左边,因此将right更新为mid - 1,缩小查找范围到左半部分。

      • 如果arr[mid]大于target,则目标元素应该在当前中间元素的右边,所以将left更新为mid + 1,缩小查找范围到右半部分。

⑤查找结果输出

  • 根据result变量的值来判断是否找到目标数字。如果result不等于-1,说明找到了目标数字,通过printf函数输出目标数字及其在数组中的索引;如果result等于-1,则表示未找到目标数字,同样通过printf函数输出相应的提示信息。不过这里代码最后输出提示信息时有个小错误,printf("未找到目标数字 %d\n", darget);应该是printf("未找到目标数字 %d\n", target);,即把错误的darget修正为target

2.4算法效率分析

二分查找算法的时间复杂度为O(log n),其中n是数组的长度。在每次循环中,查找范围都会缩小一半,所以经过对数级别的次数就能找到目标元素(如果存在的话)或者确定其不存在。相比于简单的顺序查找(时间复杂度为),二分查找在处理大型有序数组时效率更高。

 

总体而言,这段代码实现了一个基本的二分查找功能,但需要注意修正输出提示信息时的拼写错误以确保代码的正确性。

三、素数判断

3.1原理

素数是指一个大于 1 且除了 1 和它自身外,不能被其他自然数整除的数。

①素数的定义及判断依据

根据素数的定义,要判断一个数n是否为素数,需要检查它是否能被 2 到n - 1之间的任何数整除。如果在这个范围内都不能被整除,那么n就是素数;反之,如果能被其中某个数整除,那么n就不是素数。

②程序实现思路

本程序通过两层循环来实现对 1 到 100 之内素数的判断:

  • 外层循环负责遍历 1 到 100 之间的每一个整数,从 2 开始(因为 1 不是素数),依次对每个数进行素数判断操作。

  • 对于外层循环遍历到的每一个整数,内层循环用于具体检查该数是否能被 2 到它自身减 1 之间的数整除。通过内层循环的检查结果来确定该数是否为素数。

3.2代码实现

#include <stdio.h>
int main()
{int i, j;printf("1到100之内的素数有:\n");// 遍历1到100的数字for (i = 2; i <= 100; i++){// 假设当前数字i是素数int isPrime = 1;// 检查i是否能被2到i-1之间的数字整除for (j = 2; j < i; j++){if (i % j == 0){// 如果能被整除,说明不是素数,标记为0isPrime = 0;break;}}// 如果isPrime为1,说明是素数,输出该数字if (isPrime == 1){printf("%d ", i);}}printf("\n");return 0;
}

3.3逻辑

在这个程序中:

  • main函数中,首先定义了两个整型变量ij,分别用于外层循环和内层循环的计数。
  • 通过printf函数输出提示信息,表示接下来要输出 1 到 100 之内的素数。
  • 然后是外层循环for (i = 2; i <= 100; i++),它会从 2 开始,每次递增 1,直到 100 为止,依次遍历这个范围内的每一个整数。对于每一个遍历到的整数i,都要进行是否为素数的判断。
 
  • 外层循环for (i = 2; i <= 100; i++)用于遍历从 2 到 100 的每一个整数。因为 1 不是素数,所以从 2 开始遍历。
  • 对于每一个要判断的整数i,首先在内层循环之前假设它是素数,通过设置isPrime = 1来表示。
  • 内层循环for (j = 2; j < i; j++)用于检查当前整数i是否能被 2 到i - 1之间的任何一个整数整除。如果能被整除(即i % j == 0),那么就说明i不是素数,此时将isPrime标记为 0,并通过break语句跳出内层循环,因为一旦确定不是素数就不需要再继续检查了。
  • 最后,当内层循环结束后,如果isPrime的值仍然为 1,就说明i是素数,通过printf函数输出该数字。

3.4分析

这种判断素数的方法虽然简单直观,但效率相对较低。对于每一个要判断的数n,都需要从 2 到n - 1进行遍历检查,其时间复杂度大致为O(n的2次方)(这里的n是要判断的数的范围,在本程序中是 100)。因为对于每个数都要进行n - 1次左右的除法运算来判断是否能被整除。

 

在实际应用中,如果要判断更大范围的数是否为素数,通常会采用更高效的算法,比如埃拉托斯特尼筛法等,这些算法可以大大提高判断素数的效率。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序_小程序视图与逻辑_day3

一、目标 A. 能够知道如何实现页面之间的导航跳转 B. 能够知道如何实现下拉刷新效果 C. 能够知道如何实现上拉加载更多效果 D. 能够知道小程序中常用的生命周期 二、目录 A. 页面导航 B. 页面事件 C. 生命周期 D. WXS脚本 E. 案例-本地生活&#xff08;列表页面&#xff09;…

springboot社团服务系统的设计与实现,计算机毕业设计项目源码316,计算机毕设程序(LW+开题报告、中期报告、任务书等全套方案)

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。本次开发一套社团服务系统有管理员&#x…

Linux服务管理-kerberos

Kerberos 官网文档‘&#xff1a;Kerberos&#xff1a;网络身份验证协议 (mit.edu) 基本概念&#xff1a;Kerberos基本概念及原理汇总-腾讯云开发者社区-腾讯云 (tencent.com) kerberos概述 Kerberos是一种计算机网络认证协议&#xff0c;由麻省理工学院&#xff08;MIT&#x…

区块链技术在游戏行业的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在游戏行业的应用 区块链技术在游戏行业的应用 区块链技术在游戏行业的应用 引言 区块链技术概述 定义与原理 发展历程…

MooseFS (MFS) 分布式对象存储

一、MFS 优越特性 Free (GPL): 通用文件系统&#xff0c;开源免费。在线扩容: 体系架构具有极强的可伸缩性&#xff0c;支持在线扩容。部署简单。高可用性: 支持设置任意文件冗余(数据分区)程度&#xff0c;提供比RAID10更高的冗余级别&#xff0c;同时不会影响读写性能&#…

【常见问题解答】远程桌面无法复制粘贴的解决方法

提示:文中提出了“远程桌面无法复制粘贴文件到本地”问题的三种解决方法,其中“方法 3:重启 RDP 剪贴板监视程序”亲测有效。 目录 一、问题描述二、解决方法1.方法1:设置远程桌面连接(1)打开远程桌面连接,点击【显示选项】(2)勾选“剪贴板”,并点击【详细信息】(3)…

探索光耦:达林顿光耦的特点与应用

在现代电子设备中&#xff0c;光耦作为信号隔离和传输的核心元件之一&#xff0c;扮演着至关重要的角色。达林顿光耦凭借其独特的电流放大能力和可靠性&#xff0c;在众多应用中脱颖而出。本文将探讨达林顿光耦的特点及其广泛的应用。 达林顿光耦的主要特点 高电流放大倍数&a…

河南省的一级科技查新机构有哪些?

科技查新&#xff0c;简称查新&#xff0c;是指权威机构对查新项目的新颖性作出文献评价的情报咨询服务。这一服务在科研立项、成果鉴定、项目申报等方面发挥着至关重要的作用。河南省作为中国的重要科技和教育基地&#xff0c;拥有多个一级科技查新机构&#xff0c;为本省及全…

数据结构 ——— 层序遍历链式二叉树

目录 链式二叉树示意图​编辑 何为层序遍历 手搓一个链式二叉树 实现层序遍历链式二叉树 链式二叉树示意图 何为层序遍历 和前中后序遍历不同&#xff0c;前中后序遍历链式二叉树需要利用递归才能遍历 而层序遍历是非递归的形式&#xff0c;如上图&#xff1a;层序遍历的…

【故障解决】麒麟系统右下角网络图标取消显示叹号

原文链接&#xff1a;【故障解决】麒麟系统右下角网络图标取消显示叹号 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于如何在麒麟系统中解决网络图标出现感叹号问题的文章。在日常使用麒麟系统的过程中&#xff0c;我们在内网或公网环境下&#xff0c;有时会遇…

Spring boot 集成 nacos、redis、mysql

1&#xff0c;准备好nacos环境&#xff0c;准备ncc.yml配置&#xff1a; 在配置添加 test: haha 2&#xff0c;添加依赖 在pom.xml 文件中添加Nacos 客户端的依赖&#xff0c;样例使用Spring Cloud Alibaba 版本使用2023.x 分支&#xff0c;详情可查看 版本发布说明-阿里云S…

力扣 LeetCode 206. 反转链表(Day2:链表)

解题思路&#xff1a; pre &#xff0c;cur双指针 需要通过tmp暂存cur的下一个位置&#xff0c;以方便cur的下一步移动 class Solution {public ListNode reverseList(ListNode head) {ListNode pre null;ListNode cur head;while (cur ! null) {ListNode tmp cur.next;c…

golang 实现比特币内核:公钥的 SEC 编码格式详解

比特币作为区块链的一个应用,它建立在分布式系统之上,‘节点’遍布全球。为了使所有节点协同工作并作为一个整体系统运行,需要保持所有节点同步在相同的状态中,也就是说节点之间需要频繁通信,并且相互交换大量数据消息。这要求在网络上传输的消息或数据要使用某种格式编码…

v-html 富文本中图片使用element-ui image-viewer组件实现预览,并且阻止滚动条

效果 导入组件 import ElImageViewer from "element-ui/packages/image/src/image-viewer"; components:{ ElImageViewer },模板使用组件 <el-image-viewerv-if"isShowPics":on-close"closeViewer":url-list"srcList"/>定义两…

Redhat7.9 安装 KingbaseES 金仓数据库 V9单机版(图形化安装)

Redhat7.9 安装 KingbaseES 金仓数据库 V9单机版 ——图形化安装 一、安装前规划1.1 安装包下载1.2 环境信息 二、操作系统配置2.1 检查操作系统和内存2.2 关闭防火墙和selinux2.3 配置内核参数(/etc/sysctl.conf)2.4 配置资源使用参数(/etc/security/limits.conf)2.5 配置Remo…

【Linux】进程状态的优先级

大家好呀&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流哦 本文由&#xff1a;残念ing原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各…

【Linux:IO多路复用(select函数)

什么是IO多路复用&#xff1f; 一种网络通信的手段&#xff0c;IO多路复用可以同时监测多个文件描述符&#xff0c;且这个过程是阻塞的&#xff0c;当检测有文件描述符就绪&#xff0c;程序的阻塞就会解除&#xff0c;就可以通过这些就绪的文件描述符进行通信。通过这种方式在…

软件工程笔记二—— 软件生存期模型

目录 瀑布模型 瀑布模型的特点 阶段间具有顺序性和依赖性。 推迟实现的观点 质量保证的观点 瀑布模型的优点 瀑布模型的缺点 快速原型模型 快速原型模型的优点 快速原型模型的缺点 增量模型 增量模型的优点 增量构件开发 螺旋模型 完整的螺旋模型&#xff08;顺…

视频孪生技术在金融银行网点场景中的应用价值

作为国民经济重要的基础行业&#xff0c;金融行业在高速发展的同时衍生出业务纠纷、安全防范、职能管理等诸多问题&#xff0c;对安全防范和监督管理提出了更高的要求。因此&#xff0c;如何能更好的利用视频监控系统价值&#xff0c;让管理人员更简便的浏览监控视频、更快速的…

【金融风控】特征评估与筛选详解

内容介绍 掌握单特征分析的衡量指标 知道 IV&#xff0c;PSI等指标含义 知道多特征筛选的常用方法 掌握Boruta,VIF,RFE,L1等特征筛选的使用方法 【理解】单特征分析 什么是好特征 从几个角度衡量&#xff1a;覆盖度&#xff0c;区分度&#xff0c;相关性&#xff0c;稳定…