C常用经典算法及其实现
C程序经典算法50例

C程序经典算法50例1.二分查找算法:在有序数组中查找指定元素。
2.冒泡排序算法:通过不断比较相邻元素并交换位置,将较大的元素向后冒泡。
3.快速排序算法:通过选择一个基准元素,将数组分割为左右两部分,并递归地对两部分进行快速排序。
4.插入排序算法:将数组划分为已排序和未排序两部分,每次从未排序中选择一个元素插入到已排序的合适位置。
5.选择排序算法:遍历数组,每次选择最小元素并放置在已排序部分的末尾。
6.希尔排序算法:将数组按照一定间隔进行分组并分别进行插入排序,然后逐步减小间隔并重复这个过程。
7.归并排序算法:将数组递归地划分为两部分,然后将两个有序的部分进行合并。
8.桶排序算法:将元素根据特定的映射函数映射到不同的桶中,然后对每个桶分别进行排序。
9.计数排序算法:统计每个元素的出现次数,然后根据计数进行排序。
10.基数排序算法:从低位到高位依次对元素进行排序。
11.斐波那契数列算法:计算斐波那契数列的第n项。
12.阶乘算法:计算给定数字的阶乘。
13.排列问题算法:生成给定数组的全排列。
14.组合问题算法:生成给定数组的所有组合。
15.最大连续子序列和算法:找出给定数组中和最大的连续子序列。
16.最长递增子序列算法:找出给定数组中的最长递增子序列。
17.最长公共子序列算法:找出两个给定字符串的最长公共子序列。
18.最短路径算法:计算给定有向图的最短路径。
19.最小生成树算法:构建给定连通图的最小生成树。
20.汉诺塔算法:将n个圆盘从一个柱子移动到另一个柱子的问题。
21.BFS算法:广度优先算法,用于图的遍历和查找最短路径。
22.DFS算法:深度优先算法,用于图的遍历和查找连通分量。
23.KMP算法:字符串匹配算法,用于查找一个字符串是否在另一个字符串中出现。
24.贪心算法:每次都选择当前情况下最优的方案,适用于求解一些最优化问题。
25.动态规划算法:将一个大问题划分为多个子问题,并通过子问题的解求解整个问题,适用于求解一些最优化问题。
C语言经典算法C语言代码大全

C语言经典算法C语言代码大全以下是一个非常简单的C语言代码示例,实现了冒泡排序算法。
冒泡排序是一种简单的排序算法,也是最经典和常用的排序算法之一```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])int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}int maiint n, i;printf("请输入数组中元素的个数:");scanf("%d", &n);int arr[n];printf("请输入数组元素:");for (i = 0; i < n; i++)scanf("%d", &arr[i]);}bubbleSort(arr, n);printf("排序后的数组为:");for (i = 0; i < n; i++)printf("%d ", arr[i]);}return 0;```这段代码实现了一个简单的冒泡排序算法。
用户可以输入一个整数数组,然后使用冒泡排序对数组进行排序,并打印出结果。
注意事项:1.该代码需要在支持C语言的编译器或集成开发环境中运行。
2. 在代码中使用了`scanf`函数来从用户输入获取数组元素,请确保输入的格式匹配。
3.该代码中的冒泡排序算法是一种基本的算法,适用于小规模数据,对于大规模数据可能效率较低,不适用于高性能要求的场景。
c语言循环结构经典算法

c语言循环结构经典算法C语言循环结构是程序设计中常用的一种结构,通过循环可以重复执行一段代码,实现重复性的任务。
下面列举了10个经典的算法案例,每个算法都有其特定的应用场景和解决问题的方法。
1. 阶乘计算:计算一个数的阶乘,即该数与小于它的所有正整数的乘积。
通过循环结构可以逐步累乘,最终得到阶乘结果。
2. 素数判断:判断一个数是否为素数,即只能被1和自身整除的数。
通过循环结构可以逐一判断该数是否能被小于它的每个数整除,若能则不是素数。
3. 斐波那契数列:斐波那契数列是指从第3项开始,每一项都等于前两项之和。
通过循环结构可以逐一计算每一项的值,从而得到完整的斐波那契数列。
4. 最大公约数:求两个数的最大公约数,即能同时整除两个数的最大正整数。
通过循环结构可以从较小的数开始逐一判断能否同时整除两个数,找到最大的能整除的数即为最大公约数。
5. 最小公倍数:求两个数的最小公倍数,即能同时被两个数整除的最小正整数。
通过循环结构可以从较大的数开始逐一判断能否被两个数同时整除,找到最小的能被整除的数即为最小公倍数。
6. 简单排序:对一组数进行排序,使其按照从小到大或从大到小的顺序排列。
通过循环结构可以比较相邻的两个数的大小,若顺序不对则交换位置,直到整个序列有序。
7. 数字翻转:将一个正整数从高位到低位逆序排列。
通过循环结构可以依次取出每一位的数字,然后将其乘以相应的权重得到逆序后的结果。
8. 队列模拟:模拟队列的入队和出队操作,实现数据的先进先出。
通过循环结构可以不断接收用户的输入,并根据不同的指令执行相应的操作。
9. 栈模拟:模拟栈的入栈和出栈操作,实现数据的后进先出。
通过循环结构可以不断接收用户的输入,并根据不同的指令执行相应的操作。
10. 二分查找:在一个有序数列中查找指定的元素,通过循环结构可以不断缩小查找范围,直到找到目标元素或确定不存在。
以上是10个经典的C语言循环结构算法,每个算法都有其独特的解决问题的方法。
C语言七大算法

C语言七大算法一、概述算法是计算机程序设计中解决问题的方法和步骤的描述,是计算机科学的重要基础。
在计算机科学中,有许多经典的算法被广泛应用,并成为不可或缺的工具。
本文将介绍C语言中的七大经典算法,包括排序算法、查找算法、图算法、字符串算法、动态规划算法、贪心算法和分治算法。
二、排序算法排序是将一组元素按照特定规则进行重新排列的过程。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。
这些排序算法在C语言中都有相应的实现,并且各有特点和适用场景。
三、查找算法查找算法用于在一组数据中查找特定值的位置或判断是否存在。
常见的查找算法有线性查找、二分查找、哈希查找等。
这些算法在C语言中的实现可以帮助我们快速地定位目标值。
四、图算法图算法用于解决与图相关的问题,包括最短路径问题、最小生成树问题、拓扑排序等。
在C语言中,我们可以利用图的邻接矩阵或邻接表来实现相关的图算法。
五、字符串算法字符串算法主要用于解决字符串匹配、替换、拼接等问题。
在C语言中,我们可以使用字符串库函数来完成一些基本的字符串操作,例如字符串比较、复制、连接等。
六、动态规划算法动态规划算法是解决一类最优化问题的常用方法,它将问题分解为多个子问题,并通过保存已解决子问题的结果来避免重复计算。
在C语言中,我们可以使用动态规划算法来解决背包问题、最长公共子序列问题等。
七、贪心算法贪心算法是一种通过每一步的局部最优选择来达到全局最优的方法。
贪心算法通常在解决最优化问题时使用,它快速、简单,并且可以给出近似最优解。
C语言中可以使用贪心算法来解决霍夫曼编码、最小生成树等问题。
八、分治算法分治算法是一种将问题分解为多个相同或类似的子问题然后递归解决的方法。
常见的分治算法有快速排序、归并排序等。
在C语言中,我们可以使用分治算法来提高程序的效率和性能。
总结:本文介绍了C语言中的七大经典算法,包括排序算法、查找算法、图算法、字符串算法、动态规划算法、贪心算法和分治算法。
非常全C语言常用算法

一、基本算法1.交换(两量交换借助第三者)例1、任意读入两个整数,将二者的值交换后输出。
main(){int a,b,t;scanf("%d%d",&a,&b);printf("%d,%d\n",a,b);t=a; a=b; b=t;printf("%d,%d\n",a,b);}【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。
假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。
其中t为中间变量,起到“空杯子”的作用。
注意:三句赋值语句赋值号左右的各量之间的关系!【应用】例2、任意读入三个整数,然后按从小到大的顺序输出。
main(){int a,b,c,t;scanf("%d%d%d",&a,&b,&c);/*以下两个if语句使得a中存放的数最小*/if(a>b){ t=a; a=b; b=t; }if(a>c){ t=a; a=c; c=t; }/*以下if语句使得b中存放的数次小*/if(b>c) { t=b; b=c; c=t; }printf("%d,%d,%d\n",a,b,c);}2.累加累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。
例1、求1+2+3+……+100的和。
main(){int i,s;s=0; i=1;while(i<=100){s=s+i; /*累加式*/i=i+1; /*特殊的累加式*/}printf("1+2+3+...+100=%d\n",s);}【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。
10个经典的C语言基础算法及代码

10个经典的C语言基础算法及代码1.冒泡排序算法冒泡排序是一种简单但效率较低的排序算法,在每一轮遍历中比较相邻的两个元素,如果顺序不正确则交换它们,直到整个数组有序为止。
```cvoid bubbleSort(int arr[], int n)for (int i = 0; i < n-1; i++)for (int j = 0; j < n-1-i; j++)if (arr[j] > arr[j+1])int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}```2.选择排序算法选择排序是一种简单直观的排序算法,它每次从待排序的数组中选择最小(或最大)的元素,并放到已排序的数组末尾。
```cvoid selectionSort(int arr[], int n)for (int i = 0; i < n-1; i++)int min_index = i;for (int j = i+1; j < n; j++)if (arr[j] < arr[min_index])min_index = j;}}int temp = arr[i];arr[i] = arr[min_index];arr[min_index] = temp;}```3.插入排序算法插入排序的基本思想是将数组分为已排序和未排序两部分,每次将未排序的元素插入到已排序的合适位置。
```cvoid insertionSort(int arr[], int n)for (int i = 1; i < n; i++)int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key)arr[j+1] = arr[j];j--;}arr[j+1] = key;}```4.快速排序算法快速排序使用分治法的思想,每次选择一个基准元素,将小于基准的元素放到左边,大于基准的元素放到右边,然后递归地对左右两个子数组进行排序。
c语言经典算法

c语言经典算法1. 冒泡排序:冒泡排序(Bubble Sort)是一种简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
2. 选择排序:选择排序(Selection Sort)是一种简单直观的排序算法。
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
以此类推,直到全部待排序的数据元素排完。
3. 插入排序:插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
4. 希尔排序:希尔排序(Shell Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。
希尔排序是非稳定排序算法。
该方法因DL.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
5. 归并排序:归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法。
该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
C语言常用算法程序汇总

C程序设计的常用算法算法(Algorithm):计算机解题的基本思想方法和步骤。
算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。
通常使用自然语言、结构化流程图、伪代码等来描述算法。
一、简单数值类算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。
1、求阶乘:n!=1*2*384…..*n; n!= n*(n-1)!=下列程序用于求n的阶乘.在累乘之前,一定要将用于存放乘积的变量的值初始化为1.long func(int n){int i;long t=1;for(i=2;i<=n;i++)t*=i;return t;}printf("\n");}main(){ int n;scanf("%d", &n);printf("n!=%ld\n", fac(n));}2、整数拆分问题:把一个整数各个位上的数字存到数组中#define N 4 /* N代表整数位数*/viod split(int n, int a[ ])/* 1478: a[ 3]=8, a[2 ]=7, a[1 ]=4…*/{int i;for(i=N-1;i!=0; i--){ a[i]=n%10;n=n/10;}}main(){int i,m=1478,b[N-1];split(m, b);for(i=0;i<4; i++)printf(“%5d”, b[i]);}3、求整数的因子之和12=1*2*3*4 long factor(int n){int i;long sum=0;for(i=1;i<=n;i++)if(n%i= =0)sum+=i;return sum;}注意:因子包括1和自身。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C常用经典算法及其实现集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-常用算法经典代码(C++版)一、快速排序voidqsort(intx,inty)//待排序的数据存放在a[1]..a[n]数组中{inth=x,r=y;intm=a[(x+y)>>1];//取中间的那个位置的值while(h<r){while(a[h]<m)h++;//比中间那个位置的值小,循环直到找一个比中间那个值大的while(a[r]>m)r--;//比中间那个位置的值大,循环直到找一个比中间那个值小的if(h<=r){inttemp=a[h];//如果此时h<=r,交换a[h]和a[r]a[h]=a[r];a[r]=temp;h++;r--;//这两句必不可少哦}}if(r>x)qsort(x,r);//注意此处,尾指针跑到前半部分了if(h<y)qsort(h,y);//注意此处,头指针跑到后半部分了}调用:qsort(1,n)即可实现数组a中元素有序。
适用于n比较大的排序二、冒泡排序voidpaopao(void)//待排序的数据存放在a[1]..a[n]数组中{for(inti=1;i<n;i++)//控制循环(冒泡)的次数,n个数,需要n-1次冒泡for(intj=1;j<=n-i;j++)//相邻的两两比较if(a[j]<a[j+1]){inttemp=a[j];a[j]=a[j+1];a[j+1]=temp;}}或者voidpaopao(void)//待排序的数据存放在a[1]..a[n]数组中{for(inti=1;i<n;i++)//控制循环(冒泡)的次数,n个数,需要n-1次冒泡for(intj=n-i;j>=1;j--)//相邻的两两比较if(a[j]<a[j+1]){inttemp=a[j];a[j]=a[j+1];a[j+1]=temp;}}调用:paopao(),适用于n比较小的排序三、桶排序voidbucketsort(void)//a的取值范围已知。
如a<=cmax。
{memset(tong,0,sizeof(tong));//桶初始化for(inti=1;i<=n;i++)//读入n个数{intacin>>a;tong[a]++;}//相应的桶号计数器加1for(inti=1;i<=cmax;i++){if(tong[i]>0)//当桶中装的树大于0,说明i出现过tong[i]次,否则没出现过iwhile(tong[i]!=0){tong[i]--;cout<<i<<’‘;}}}桶排序适用于那些待排序的关键字的值在已知范围的排序。
四、合(归)并排序voidmerge(intl,intm,intr)//合并[l,m]和[m+1,r]两个已经有序的区间{intb[101];//借助一个新的数组B,使两个有序的子区间合并成一个有序的区间,b数组的大小要注意inth,t,k;k=0;//用于新数组B的指针h=l;t=m+1;//让h指向第一个区间的第一个元素,t指向第二个区间的第一个元素。
while((h<=m)&&(t<=r))//在指针h和t没有到区间尾时,把两个区间的元素抄在新数组中{k++;//新数组指针加1if(a[h]<a[t]){b[k]=a[h];h++;}//抄第一个区间元素到新数组else{b[k]=a[t];t++;}//抄第二个区间元素到新数组}while(h<=m){k++;b[k]=a[h];h++;}//如果第一个区间没有抄结束,把剩下的抄在新数组中while(t<=r){k++;b[k]=a[t];t++;}//如果第二个区间没有抄结束,把剩下的抄在新数组中for(into=1;o<=k;o++)//把新数组中的元素,再抄回原来的区间,这两个连续的区间变为有序的区间。
a[l+o-1]=b[o];}voidmergesort(intx,inty)//对区间[x,y]进行二路归并排序{intmid;if(x>=y)return;mid=(x+y)/2;//求[x,y]区间,中间的那个点mid,mid把x,y区间一分为二mergesort(x,mid);//对前一段进行二路归并mergesort(mid+1,y);//对后一段进行二路归并merge(x,mid,y);//把已经有序的前后两段进行合并}归并排序应用了分治思想,把一个大问题,变成两个小问题。
二分是分治的思想。
五、二分查找intfind(intx,inty,intm)//在[x,y]区间查找关键字等于m的元素下标{inthead,tail,mid;head=x;tail=y;mid=((x+y)/2);//取中间元素下标if(a[mid]==m)returnmid;//如果中间元素值为m返回中间元素下标midif(head>tail)return0;//如果x>y,查找失败,返回0if(m>a[mid])//如果m比中间元素大,在后半区间查找,返回后半区间查找结果returnfind(mid+1,tail);else//如果m比中间元素小,在前半区间查找,返回后前区间查找结果returnfind(head,mid-1);}六、高精度加法#include<iostream>#include<cstring>usingnamespacestd;intmain(){stringstr1,str2;inta[250],b[250],len;//数组的大小决定了计算的高精度最大位数inti;memset(a,0,sizeof(a));memset(b,0,sizeof(b));cin>>str1>>str2;//输入两个字符串a[0]=str1.length();//取得第一个字符串的长度for(i=1;i<=a[0];i++)//把第一个字符串转换为整数,存放在数组a中a[i]=str1[a[0]-i]-'0';b[0]=str2.length();//取得第二个字符串长度for(i=1;i<=b[0];i++)//把第二个字符串中的每一位转换为整数,存放在数组B中b[i]=str2[b[0]-i]-'0';len=(a[0]>b[0]a[0]:b[0]);//取两个字符串最大的长度for(i=1;i<=len;i++)//做按位加法,同时处理进位{a[i]+=b[i];a[i+1]+=a[i]/10;a[i]%=10;}len++;//下面是去掉最高位的0,然后输出。
while((a[len]==0)&&(len>1))len--;for(i=len;i>=1;i--)cout<<a[i];return0;}注意:两个数相加,结果的位数,应该比两个数中大的那个数多一位。
七、高精度减法#include<iostream> usingnamespacestd;intcompare(strings1,strings2); intmain(){stringstr1,str2;inta[250],b[250],len;inti;memset(a,0,sizeof(a)); memset(b,0,sizeof(b));cin>>str1>>str2;a[0]=str1.length();for(i=1;i<=a[0];i++)a[i]=str1[a[0]-i]-'0';b[0]=str2.length();for(i=1;i<=b[0];i++)b[i]=str2[b[0]-i]-'0';if((compare(str1,str2))==0)//大于等于,做按位减,并处理借位。
{for(i=1;i<=a[0];i++){a[i]-=b[i];if(a[i]<0){a[i+1]--;a[i]+=10;}}a[0]++;while((a[a[0]]==0)&&(a[0]>1))a[0]--;for(i=a[0];i>=1;i--)cout<<a[i];cout<<endl;}else{cout<<'-';//小于就输出负号for(i=1;i<=b[0];i++)//做按位减,大的减小的{b[i]-=a[i];if(b[i]<0){b[i+1]--;b[i]+=10;}}b[0]++;while((b[b[0]]==0)&&(b[0]>1))b[0]--;for(i=b[0];i>=1;i--)cout<<b[i];cout<<endl;}return0;}intcompare(strings1,strings2)//比较字符串(两个数)数字的大小,大于等于返回0,小于返回1。
{if(s1.length()>s2.length())return0;//先比较长度,哪个字符串长,对应的那个数就大if(s1.length()<s2.length())return1;for(inti=0;i<=s1.length();i++)//长度相同时,就一位一位比较。
{if(s1[i]>s2[i])return0;if(s1[i]<s2[i])return1;}return0;//如果长度相同,每一位也一样,就返回0,说明相等}做减法时,首先要判断两个字符串的大小,决定是否输出负号,然后就是按位减法,注意处理借位。
八、高精度乘法#include<iostream>#include<cstring>usingnamespacestd;intmain(){stringstr1,str2;inta[250],b[250],c[500],len;//250位以内的两个数相乘inti,j;memset(a,0,sizeof(a));memset(b,0,sizeof(b));cin>>str1>>str2;a[0]=str1.length();for(i=1;i<=a[0];i++)a[i]=str1[a[0]-i]-'0';b[0]=str2.length();for(i=1;i<=b[0];i++)b[i]=str2[b[0]-i]-'0';memset(c,0,sizeof(c));for(i=1;i<=a[0];i++)//做按位乘法同时处理进位,注意循环内语句的写法。