基于C语言的算法总结(不定时更新)

这篇博客我准备写一些我见过的算法,虽然现在我见过的还很少,但我相信会越来越多,方便日后自己查阅

好了 开始了

求解最大子序列和的最有效的算法

 1 int MaxSubsequenceSum(const int A[], int N)
 2 {
 3   int ThisSum, MaxSum, j;
 4   // 定义本次循环的和 与 最大和 为0
 5   ThisSum = MaxSum = 0;
 6   // 循环求和
 7   for (j = 0; j < N; j++)
 8   {
 9        ThisSum += A[j];
10        // 判断本次的和与最大和的大小,如果本次和比最大和大,把本次和的值赋值给最大和
11        if (ThisSum > MaxSum)
12         MaxSum = ThisSum;
13        /* 如果本次和小于0,将本次和赋值为0 因为加到小于0了肯定不是最大子序列和了
14         将其赋值为0 从新进行最大子序列和的比较 */
15        else if ( ThisSum < 0)
16        ThisSum = 0;
17   }
18       return MaxSum;
19 }
20 // 这个算法只循环了一次数组就求出了最大子序列和

已知排序好的数组,求某个值的下标---->对分查找

 1 int BinarySearch( const int A[], int X, int N)
 2 {
 3     // 定义最小坐标,中间坐标,最大坐标
 4     int Low, Mid, High;
 5     Low = 0; High = N - 1;
 6     // 循环条件 最小坐标<=最大坐标
 7     while (Low <= High) {
 8         // 中间坐标算出来
 9         Mid = (Low + High) / 2;
10         // 判断中间坐标对应的值是否小于要找到的值
11         if (A[Mid] < X) {
12             /* 如果小于让最小坐标变成中间坐标 + 1
13             (也就是不用考虑中间坐标前面的数了) */
14             Low = Mid + 1;
15         } else if (A[Mid] > X) {
16             /* 如果大于让最大坐标变成中间坐标 - 1
17              (也就是不用考虑中间坐标后面的数了) */
18             High = Mid - 1;
19         } else {
20             // 循环找到坐标
21             return Mid;  // Found
22         }
23     }
24     return -1;   // Not Found
25 }

计算最大公因数(欧几里德算法)

两个整数的最大公因数(Gcd)是同时整除二者的最大整数 例:Gcd(50, 15) = 5

 1 unsigned int Gcd (unsigned int M, unsigned int N)
 2 {
 3     unsigned int Rem;
 4     while ( N > 0) {
 5         Rem = M % N;
 6         M = N;
 7         N = Rem;
 8     }
 9     return M;
10 }
11 // 算法通过连续计算余数直到余数是0为止,最后的非零余数就是最大公因数

高效率的取幂算法

 1 /*
 2  如果N是偶数,我们有 X的N次方 = X的N/2次方 * X的N/2次方
 3  如果N是奇数,我们有 X的N次方 = X的(N - 1)/2次方 * X的(N - 1)/2次方 * X
 4  */
 5 long int Pow (long int x, int N)
 6 {
 7     if (N == 0) {
 8         return 0;
 9     }
10     if (N == 1) {
11         return x;
12     }
13     if (N % 2 == 0) {
14         return Pow(x*x, N/2);
15     } else {
16         return Pow(x*x, N/2) * x;
17     }
18 }
19 // 此算法运用到了递归

数组排序:冒泡排序

 1 void sortArray(int a[], int len)
 2 {
 3     for (int i = 0; i < len-1; i++) {
 4         /*
 5          每趟排序都会确定一个数,所以需要再循环len-i次,但因为每次都是
 6          相邻的两个数比较,为了a[j + 1]不越界,让j循环到len-i-1时停止
 7          */
 8         for (int j = 0; j < len-i-1; j++) {
 9             int tmp;
10             // 如果条件满足,交换a[j]和a[j+1]两个相邻数的值
11             if (a[j] > a[j+1]) {
12                 tmp = a[j];
13                 a[j] = a[j+1];
14                 a[j+1] = tmp;
15             }
16         }
17     }
18 }

数组排序:选择排序

 1 void selectSort(int a[], int len)
 2 {
 3     // 确定需要排序的次数
 4     for (int i = 0; i < len - 1; i++) {
 5         // 每一次都是拿一个元素与后面其他的元素进行比较,找到最小值
 6         for (int j = i + 1; j < len; j++) {
 7             if (a[i] > a[j]) {
 8                 int tmp = a[i];
 9                 a[i] = a[j];
10                 a[j] = tmp;
11             }
12         }
13     }
14 }

-----------------------------------------------未完待续-----------------------------------------------

提示:1、代码由本人手打如有失误请麻烦提醒下,我将及时改正

2、注释代表个人理解有歧义请指教,谢谢

时间: 2024-08-07 11:21:25

基于C语言的算法总结(不定时更新)的相关文章

实现基于C语言的二值图像连通域标记算法

实现基于C语言的二值图像连通域标记算法 1 #include <stdio.h> 2 #include <stdarg.h> 3 #include <stddef.h> 4 #include <stdlib.h> 5 #include <stdint.h> 6 #include <math.h> 7 8 #define CONNECTIVITY4 4 9 #define CONNECTIVITY8 8 10 #define STACK

逻辑回归算法实现_基于R语言

逻辑回归(Logistic Regression)模型和线性回归非常相似,可以说就是在逻辑回归的基础上加上了一步逻辑转换,也就是因为这个转换,使逻辑回归模型非常适用于二分类问题的概率预测.本文主要详述逻辑回归模型的基础以及逻辑回归模型的R语言实现. 一.逻辑回归模型原理 首先要讲一下线性回归在预测分类事件中的缺点:线性回归模型的泛化能力很差,如果训练集存在噪点,会导致模型的结果特别差,不同样本建立起来的模型分割点不同:下图中根据年龄预测是否成年的分类问题,斜线就是根据训练集拟合出来的线性回归模型

中文分词实践(基于R语言)

背景:分析用户在世界杯期间讨论最多的话题. 思路:把用户关于世界杯的帖子拉下来,然后做中文分词+词频统计,最后将统计结果简单做个标签云,效果如下: 后续:中文分词是中文信息处理的基础,分词之后,其实还有特别多有趣的文本挖掘工作可以做,也是个知识发现的过程,以后有机会再学习下. ================================================== * 中文分词常用实现: 单机:R语言+Rwordseg分词包 (建议数据量<1G) 分布式:Hadoop+Smallse

在Hadoop上运行基于RMM中文分词算法的MapReduce程序

原文:http://xiaoxia.org/2011/12/18/map-reduce-program-of-rmm-word-count-on-hadoop/ 在Hadoop上运行基于RMM中文分词算法的MapReduce程序 23条回复 我知道这个文章标题很“学术”化,很俗,让人看起来是一篇很牛B或者很装逼的论文!其实不然,只是一份普通的实验报告,同时本文也不对RMM中文分词算法进行研究.这个实验报告是我做高性能计算课程的实验里提交的.所以,下面的内容是从我的实验报告里摘录出来的,当作是我学

C语言排序算法复习

排序算法有很多种,这里在复习和分析的基础上,做一个自己的总结: 首先要知道有哪些排序算法,google一下,有云C语言7大经典排序算法(也有8大).主要包括冒泡排序,快速排序,选择排序,插入排序,希尔排序,归并排序,堆排序,8大的还有基数排序.各有各的版本,代码写法也各不相同.所以这里以整理思路为先,代码只是作为自己的一个备份. 搞清楚的概念:稳定排序和不稳定排序,就看序列中两个值相等的数,排完序之后的相对位置是否改变,如果改变了就不稳定. 内部排序和外部排序,只用到内存即可完成排序的就叫内部排

Java进阶(五十七)-基于感知哈希算法的图像配准

Java进阶(五十七)-基于感知哈希算法的pHash图像配准算法 ??毕业论文提交之后,老师交给自己一项任务:图像配准,也就是给你两幅图像,通过系统来判定两幅图像是否为同一副图像.自己作为这一方面的小白,先去网上搜索一下相应的检测方法,当然有现成的API调用最好,花钱也无所谓. ??我们这里采用的基础关键技术叫做 "感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同

基于Java语言构建区块链(一)—— 基本原型

引言 区块链技术是一项比人工智能更具革命性的技术,人工智能只是提高了人类的生产力,而区块链则将改变人类社会的生产关系,它将会颠覆我们人类社会现有的协作方式.了解和掌握区块链相关知识和技术,是我们每位开发人员必须要去做的事情,这样我们才能把握住这波时代趋势的红利. 本文将基于Java语言构建简化版的blockchain,来实现数字货币. 创建区块区块链是由包含交易信息的区块从后向前有序链接起来的数据结构.区块被从后向前有序地链接在这个链条里,每个区块都指向前一个区块.以比特币为例,每个区块主要包含

新闻推荐系统:基于内容的推荐算法(Recommender System:Content-based Recommendation)

因为开发了一个新闻推荐系统的模块,在推荐算法这一块涉及到了基于内容的推荐算法(Content-Based Recommendation),于是借此机会,基于自己看了网上各种资料后对该分类方法的理解,用尽量清晰明了的语言,结合算法和自己开发推荐模块本身,记录下这些过程,供自己回顾,也供大家参考~ 目录 一.基于内容的推荐算法 + TFIDF 二.在推荐系统中的具体实现技巧 正文 一.基于内容的推荐算法 + TFIDF 主流推荐算法大致可分为: 基于内容(相似度)的推荐 基于用户/物品相似度的协同过

基于乐理模型的算法作曲研究

Abstraction Musical composition is a sophisticated movement of thought that is unique for humans. More concretely, composition reflects the basic technology and theory of music, i.e. harmonics, polyphony, orchestration, structure and so on, which are