白骑士的C语言教学高级篇 3.4 C语言中的算法

        算法是解决问题的核心。无论是排序、搜索,还是递归与动态规划,算法的选择和实现对程序的效率和性能有着重要影响。本节将介绍几种常见的算法,包括排序算法、搜索算法,以及递归和动态规划的应用。

排序算法

        排序算法是将一组数据按特定顺序排列的过程。常见的排序算法有冒泡排序、选择排序、插入排序、快速排序和归并排序等。下面是几种常见排序算法的介绍和示例代码。

冒泡排序

        冒泡排序通过多次遍历数组,每次比较相邻的元素,如果顺序错误就交换,直到整个数组有序,例如:

#include <stdio.h>void bubbleSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {for (int j = 0; j < n-i-1; j++) {if (arr[j] > arr[j+1]) {// 交换arr[j]和arr[j+1]int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr)/sizeof(arr[0]);bubbleSort(arr, n);printf("排序后的数组: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

选择排序

        选择排序每次从未排序部分中选出最小(或最大)的元素,放到已排序部分的末尾,例如:

#include <stdio.h>void selectionSort(int arr[], int n) {for (int i = 0; i < n-1; i++) {int minIndex = i;for (int j = i+1; j < n; j++) {if (arr[j] < arr[minIndex])minIndex = j;}int temp = arr[minIndex];arr[minIndex] = arr[i];arr[i] = temp;}
}int main() {int arr[] = {64, 25, 12, 22, 11};int n = sizeof(arr)/sizeof(arr[0]);selectionSort(arr, n);printf("排序后的数组: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

快速排序

        快速排序通过选择一个基准元素,将数组分成两部分,一部分所有元素比基准元素小,另一部分所有元素比基准元素大,然后递归地对这两部分进行排序,例如:

#include <stdio.h>void swap(int* a, int* b) {int t = *a;*a = *b;*b = t;
}int partition (int arr[], int low, int high) {int pivot = arr[high];int i = (low - 1);for (int j = low; j <= high-1; j++) {if (arr[j] < pivot) {i++;swap(&arr[i], &arr[j]);}}swap(&arr[i + 1], &arr[high]);return (i + 1);
}void quickSort(int arr[], int low, int high) {if (low < high) {int pi = partition(arr, low, high);quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}int main() {int arr[] = {10, 7, 8, 9, 1, 5};int n = sizeof(arr)/sizeof(arr[0]);quickSort(arr, 0, n-1);printf("排序后的数组: ");for (int i = 0; i < n; i++)printf("%d ", arr[i]);return 0;
}

搜索算法

        搜索算法用于在数据集合中查找特定元素。常见的搜索算法有线性搜索和二分搜索。

线性搜索

        线性搜索逐一比较数据集合中的每个元素,直到找到目标元素或搜索完所有元素,例如:

#include <stdio.h>int linearSearch(int arr[], int n, int x) {for (int i = 0; i < n; i++) {if (arr[i] == x)return i;}return -1;
}int main() {int arr[] = {2, 3, 4, 10, 40};int x = 10;int n = sizeof(arr)/sizeof(arr[0]);int result = linearSearch(arr, n, x);if(result == -1)printf("元素不在数组中\n");elseprintf("元素在数组中的索引: %d\n", result);return 0;
}

二分搜索

        二分搜索在有序数组中查找目标元素,通过反复将搜索范围缩小为一半,直到找到目标元素或搜索范围为空,例如:

#include <stdio.h>int binarySearch(int arr[], int l, int r, int x) {while (l <= r) {int m = l + (r - l) / 2;if (arr[m] == x)return m;if (arr[m] < x)l = m + 1;elser = m - 1;}return -1;
}int main() {int arr[] = {2, 3, 4, 10, 40};int x = 10;int n = sizeof(arr)/sizeof(arr[0]);int result = binarySearch(arr, 0, n-1, x);if(result == -1)printf("元素不在数组中\n");elseprintf("元素在数组中的索引: %d\n", result);return 0;
}

递归与动态规划

递归

        是指一个函数调用其自身。递归算法通常用于解决分治问题,例如斐波那契数列和阶乘,例如:

#include <stdio.h>int fibonacci(int n) {if (n <= 1)return n;return fibonacci(n - 1) + fibonacci(n - 2);
}int main() {int n = 9;printf("Fibonacci数列的第%d项是: %d\n", n, fibonacci(n));return 0;
}

动态规划

        是一种将复杂问题分解为更小子问题的技术,通过记忆化或表格化存储子问题的结果,避免重复计算,提升算法效率,例如:

#include <stdio.h>int fibonacci(int n) {int f[n+1];f[0] = 0;f[1] = 1;for (int i = 2; i <= n; i++) {f[i] = f[i-1] + f[i-2];}return f[n];
}int main() {int n = 9;printf("Fibonacci数列的第%d项是: %d\n", n, fibonacci(n));return 0;
}

总结

        排序算法、搜索算法以及递归与动态规划是C语言编程中不可或缺的重要部分。通过掌握这些算法,将能够高效地处理和操作数据,解决复杂的编程问题。学习和理解这些基础算法,不仅有助于提升编程能力,也为解决实际问题打下坚实的基础。

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

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

相关文章

昇思25天学习打卡营第17天|SSD目标检测

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) SSD目标检测 模型简介 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD…

使用 CloudWatch + SNS + Lambda 实现多渠道告警系统

1. 简介 在现代云计算环境中,及时和有效的监控告警对于维护系统的稳定性至关重要。本文将介绍如何使用 AWS CloudWatch、Simple Notification Service (SNS) 和 Lambda 函数构建一个多渠道告警系统,包括邮件告警、钉钉机器人告警和电话语音告警。 2. 系统架构 整个系统的工…

利用border绘制三角技巧

绘制三角形的效果如图 <html lang"zh-cn"> <head><meta charset"UTF-8"><title>demo</title><style>* {margin: 0;padding: 0;}.box {/* 盒子宽高改成零就变成三角形 &#xff0c;需要哪个方向的三角形就设置哪个方向…

Python一些可能用的到的函数系列130 UCS-Time Brick

说明 UCS对象是基于GFGoLite进行封装&#xff0c;且侧重于实现UCS规范。 内容 1 函数 我发现pydantic真是一个特别好用的东西&#xff0c;可以确保在数据传递时的可靠&#xff0c;以及对某个数据模型的描述。 以下&#xff0c;UCS给出了id、time相关的brick映射&#xff0…

【分布式系统五】监控平台Zabbix实际监控运用(命令+截图详细版)

目录 一.Zabbix 监控 Windows 1.安装zabbix 2.Web 页面添加主机&#xff0c;关联模板 二.Zabbix 监控 Java 应用 1.安装tomcat 2.服务端安装 zabbix-java-gateway 3.Web 页面添加主机&#xff0c;关联模板 三.Zabbix 监控 SNMP 1.服务端安装 snmp 监控程序 2.修改 sn…

RT-Thread和freeRTOS启动流程

一. freeRTOS启动流程 二. RT-Thread启动流程 因为RT-Thread中我们定义了补丁函数也叫做钩子函数--$Sub$$main()--作为一个新功能函数&#xff0c;可以将原有函数劫持下来&#xff0c;并在之后的程序运行中加上$Super $ $前缀来重新调用原始函数。 所以启动流程是$Sub$$main(…

Chiasmodon:一款针对域名安全的公开资源情报OSINT工具

关于Chiasmodon Chiasmodon是一款针对域名安全的公开资源情报OSINT工具&#xff0c;该工具可以帮助广大研究人员从各种来源收集目标域名的相关信息&#xff0c;并根据域名、Google Play应用程序、电子邮件地址、IP地址、组织和URL等信息进行有针对性的数据收集。 该工具可以提…

利用node连接mongodb实现一个小型后端服务系统demo

http 请求 实现get请求数据库数据&#xff1b;实现添加数据实现编辑数据实现删除数据实现导出txt文件、Excel文件实现查询数据库数据并利用导出为excel文件 node 版本 16.16.0 node 版本 18.16.0 会连接 MongoDB 数据库错误。 Connected to MongoDB failed MongoServerSele…

Nginx-简介

介绍 nginx是一款HTTP和反向代理服务器、邮件代理服务器和通用TCP/IP代理服务器&#xff0c;在俄罗斯广泛使用&#xff0c;用于代理高负载站点。 版本 nginx开源版nginx plus企业版openresty将nginx和lua脚本结合 tengine更稳定、高性能 正向代理 客户端和代理服务是一伙的…

【vue动态组件】VUE使用component :is 实现在多个组件间来回切换

VUE使用component :is 实现在多个组件间来回切换 component :is 动态父子组件传值 相关代码实现&#xff1a; <component:is"vuecomponent"></component>import componentA from xxx; import componentB from xxx; import componentC from xxx;switch(…

生产力工具|viso常用常见科学素材包

一、科学插图素材网站 一图胜千言&#xff0c;想要使自己的论文或重要汇报更加引人入胜&#xff1f;不妨考虑利用各类示意图和科学插图来辅助研究工作。特别是对于新手或者繁忙的科研人员而言&#xff0c;利用免费的在线科学插图素材库&#xff0c;能够极大地节省时间和精力。 …

Python字符编码检测利器: chardet库详解

Python字符编码检测利器: chardet库详解 1. chardet简介2. 安装3. 基本使用3.1 检测字符串编码3.2 检测文件编码 4. 高级功能4.1 使用UniversalDetector4.2 自定义编码检测 5. 实际应用示例5.1 批量处理文件编码5.2 自动转换文件编码 6. 性能优化7. 注意事项和局限性8. 总结 在…

【代码随想录】【算法训练营】【第58天】 [卡码110]字符串接龙 [卡码105]有向图的完全可达性 [卡码106]岛屿的周长

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 卡码网。 day 59&#xff0c;周五&#xff0c;继续ding~ 题目详情 [卡码110] 字符串接龙 题目描述 卡码110 字符串接龙 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C语言 […

Jackson库使用教程

1. Jackson概述 定义: Jackson是一个基于Java的开源JSON解析工具&#xff0c;用于Java对象与JSON数据的互相转换。示例JSON:{"author": "一路向北_Coding","age": 20,"hobbies": ["coding", "leetcode", "r…

昇思25天学习打卡营第13天|linchenfengxue

Diffusion扩散模型 关于扩散模型&#xff08;Diffusion Models&#xff09;有很多种理解&#xff0c;本文的介绍是基于denoising diffusion probabilistic model &#xff08;DDPM&#xff09;&#xff0c;DDPM已经在&#xff08;无&#xff09;条件图像/音频/视频生成领域取得…

小蜜蜂WMS与小蜜蜂WMS对接集成根据条件获取客户信息列表(分页)连通新增客户信息(小蜜蜂读写测试)

小蜜蜂WMS与小蜜蜂WMS对接集成根据条件获取客户信息列表&#xff08;分页&#xff09;连通新增客户信息(小蜜蜂读写测试) 接通系统&#xff1a;小蜜蜂WMS 天津市小蜜蜂计算机技术有限公司&#xff08;acbee&#xff0c;TianJinACBEEComputerTechnologyCo.,Ltd&#xff09;成立于…

基于图像处理的滑块验证码匹配技术

滑块验证码是一种常见的验证码形式&#xff0c;通过拖动滑块与背景图像中的缺口进行匹配&#xff0c;验证用户是否为真人。本文将详细介绍基于图像处理的滑块验证码匹配技术&#xff0c;并提供优化代码以提高滑块位置偏移量的准确度&#xff0c;尤其是在背景图滑块阴影较浅的情…

上海市计算机学会竞赛平台2023年2月月赛丙组平分数字(一)

题目描述 给定 &#x1d45b;n 个整数&#xff1a;&#x1d44e;1,&#x1d44e;2,⋯ ,&#x1d44e;&#x1d45b;a1​,a2​,⋯,an​&#xff0c;请判定能否将它们分成两个部分&#xff08;不得丢弃任何数字&#xff09;&#xff0c;每部分的数字之和一样大。 输入格式 第…

模拟,CF 570C - Replacement

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 570C - Replacement 二、解题报告 1、思路分析 1、长为cnt的连续串的最小操作次数为cnt - 1 2、每次将一个非. 替换为. f要么增加1要么增加2 只有前后都是 . 的时候会增加2 同理&#xff0c;当我们将一…

STM32外扩SRAM及用法

一.概述 一般单片机有片内的RAM&#xff0c;但都不多&#xff0c;比如&#xff1a;STM32F407ZGT6 自带了 192K 字节的 RAM&#xff0c;对一般应用来说&#xff0c;已经足够了&#xff0c;不过在一些对内存要求高的场合&#xff0c;比如做华丽效果的 GUI&#xff0c;处理大量数据…