当前位置: 首页 > news >正文

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

系列目录

上一篇:白骑士的C语言教学高级篇 3.3 并发与多线程

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

排序算法

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

冒泡排序

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

#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语言编程中不可或缺的重要部分。通过掌握这些算法,将能够高效地处理和操作数据,解决复杂的编程问题。学习和理解这些基础算法,不仅有助于提升编程能力,也为解决实际问题打下坚实的基础。

下一篇:白骑士的C语言教学高级篇 3.5 性能优化​​​​​​​

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用Java和WebSocket设计大型聊天系统的理论探讨
  • 【python】IPython的使用技巧
  • eclipse安装lombok
  • 萝卜快跑的狠活
  • FFmpeg——视频拼接总结
  • 昇思25天学习打卡营第17天|文本解码原理--以MindNLP为例
  • 迅狐抖音机构号授权矩阵系统源码
  • 从数字化营销与运营视角:看流量效果的数据分析
  • 重读AI金典算法模型-GPT系列
  • 【C++】C++中struct结构体和class类的区别
  • 解决:Flink向kafka写数据使用Producer精准一次(EXACTLY_ONCE)异常
  • 初学者必看的 3 个 Python 小项目
  • Oracle PL/SQL 循环批量执行存储过程
  • LT7911UX 国产原装 一拖三 edp 转LVDS 可旋转 可缩放
  • 汽车零配件行业看板管理系统应用
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【EOS】Cleos基础
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Cookie 在前端中的实践
  • Java,console输出实时的转向GUI textbox
  • javascript 哈希表
  • js继承的实现方法
  • JS学习笔记——闭包
  • 安装python包到指定虚拟环境
  • 从伪并行的 Python 多线程说起
  • 当SetTimeout遇到了字符串
  • 猴子数据域名防封接口降低小说被封的风险
  • 将 Measurements 和 Units 应用到物理学
  • 跨域
  • 入门级的git使用指北
  • 我从编程教室毕业
  • - 转 Ext2.0 form使用实例
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​Spring Boot 分片上传文件
  • !!Dom4j 学习笔记
  • # 透过事物看本质的能力怎么培养?
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)Nginx简介和安装教程
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (六)激光线扫描-三维重建
  • (十) 初识 Docker file
  • (十一)c52学习之旅-动态数码管
  • (新)网络工程师考点串讲与真题详解
  • (一)、python程序--模拟电脑鼠走迷宫
  • (原創) 物件導向與老子思想 (OO)
  • (转)为C# Windows服务添加安装程序
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .bat批处理(一):@echo off
  • .net6Api后台+uniapp导出Excel
  • .NET中使用Protobuffer 实现序列化和反序列化