C语言经典编程算法

合集下载

C程序经典算法50例

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语言中的实现可以帮助我们快速地定位目标值。

四、图算法图算法用于解决与图相关的问题,包括最短路径问题、最小生成树问题、拓扑排序等。

在C语言中,我们可以利用图的邻接矩阵或邻接表来实现相关的图算法。

五、字符串算法字符串算法主要用于解决字符串匹配、替换、拼接等问题。

在C语言中,我们可以使用字符串库函数来完成一些基本的字符串操作,例如字符串比较、复制、连接等。

六、动态规划算法动态规划算法是解决一类最优化问题的常用方法,它将问题分解为多个子问题,并通过保存已解决子问题的结果来避免重复计算。

在C语言中,我们可以使用动态规划算法来解决背包问题、最长公共子序列问题等。

七、贪心算法贪心算法是一种通过每一步的局部最优选择来达到全局最优的方法。

贪心算法通常在解决最优化问题时使用,它快速、简单,并且可以给出近似最优解。

C语言中可以使用贪心算法来解决霍夫曼编码、最小生成树等问题。

八、分治算法分治算法是一种将问题分解为多个相同或类似的子问题然后递归解决的方法。

常见的分治算法有快速排序、归并排序等。

在C语言中,我们可以使用分治算法来提高程序的效率和性能。

总结:本文介绍了C语言中的七大经典算法,包括排序算法、查找算法、图算法、字符串算法、动态规划算法、贪心算法和分治算法。

10个经典的C语言面试基础算法及代码

10个经典的C语言面试基础算法及代码

10个经典的C语言面试基础算法及代码10个经典的C语言面试基础算法及代码算法是一个程序和软件的灵魂,下面店铺为大家整理了10个经典的C语言面试基础算法及代码,希望能帮到大家!1、计算Fibonacci数列Fibonacci数列又称斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21。

C语言实现的代码如下:/* Displaying Fibonacci sequence up to nth term where n is entered by user. */#includeint main(){int count, n, t1=0, t2=1, display=0;printf("Enter number of terms: ");scanf("%d",&n);printf("Fibonacci Series: %d+%d+", t1, t2); /* Displaying first two terms */count=2; /* count=2 because first two terms are already displayed. */while (count<n){display=t1+t2;t1=t2;t2=display;++count;printf("%d+",display);}return 0;}结果输出:Enter number of terms: 10Fibonacci Series: 0+1+1+2+3+5+8+13+21+34+也可以使用下面的.源代码:/* Displaying Fibonacci series up to certain number entered by user. */#includeint main(){int t1=0, t2=1, display=0, num;printf("Enter an integer: ");scanf("%d",&num);printf("Fibonacci Series: %d+%d+", t1, t2); /* Displaying first two terms */display=t1+t2;while(display<num){printf("%d+",display);t1=t2;t2=display;display=t1+t2;}return 0;}结果输出:Enter an integer: 200Fibonacci Series: 0+1+1+2+3+5+8+13+21+34+55+89+144+2、回文检查源代码:/* C program to check whether a number is palindrome or not */#includeint main(){int n, reverse=0, rem,temp;printf("Enter an integer: ");scanf("%d", &n);temp=n;while(temp!=0){rem=temp%10;reverse=reverse*10+rem;temp/=10;}/* Checking if number entered by user and it's reverse number is equal. */if(reverse==n)printf("%d is a palindrome.",n);elseprintf("%d is not a palindrome.",n);return 0;}结果输出:Enter an integer: 1232112321 is a palindrome.3、质数检查注:1既不是质数也不是合数。

C语言经典算法大全

C语言经典算法大全

C语言经典算法大全1.冒泡排序算法冒泡排序是一种简单但低效的排序算法,它通过多次遍历列表,比较相邻元素并交换位置,直到整个列表有序。

冒泡排序的时间复杂度为O(n^2)。

```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;}}}```2.选择排序算法选择排序是一种简单但高效的排序算法,它通过多次遍历列表,找到最小元素并将其放置在正确的位置上。

选择排序的时间复杂度也为O(n^2)。

```void selectionSort(int arr[], int n)int minIndex, temp;for (int i = 0; i < n-1; i++)minIndex = i;for (int j = i+1; j < n; j++)if (arr[j] < arr[minIndex])minIndex = j;}}//交换元素temp = arr[i];arr[i] = arr[minIndex];arr[minIndex] = temp;}```3.插入排序算法插入排序是一种简单但高效的排序算法,它通过将未排序的元素插入到已排序的列表中,逐步构建排序好的列表。

插入排序的时间复杂度为O(n^2)。

```void insertionSort(int arr[], int n)int i, key, j;for (i = 1; i < n; i++)key = arr[i];j=i-1;while (j >= 0 && arr[j] > key)arr[j + 1] = arr[j];j=j-1;}arr[j + 1] = key;}```4.快速排序算法快速排序是一种高效的排序算法,它通过选择一个主元,将列表分割为两个子列表,其中一个子列表的所有元素都小于主元,另一个子列表的所有元素都大于主元。

c语言经典算法

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语言入门必学—10个经典C语言算法

C语言入门必学—10个经典C语言算法

C语言入门必学—10个经典C语言算法C语言是一种广泛使用的编程语言,具有高效、灵活和易学的特点。

它不仅在软件开发中被广泛应用,也是计算机科学专业的必修课。

在学习C语言的过程中,掌握一些经典的算法是非常重要的。

本文将介绍10个经典C语言算法,帮助读者更好地了解和掌握C语言。

一、冒泡排序算法(Bubble Sort)冒泡排序算法是最简单、也是最经典的排序算法之一。

它通过不断比较相邻的元素并交换位置,将最大(或最小)的元素逐渐“冒泡”到数组的最后(或最前)位置。

二、选择排序算法(Selection Sort)选择排序算法是一种简单但低效的排序算法。

它通过不断选择最小(或最大)的元素,并与未排序部分的第一个元素进行交换,将最小(或最大)的元素逐渐交换到数组的前面(或后面)。

三、插入排序算法(Insertion Sort)插入排序算法是一种简单且高效的排序算法。

它通过将数组分为已排序和未排序两个部分,依次将未排序部分的元素插入到已排序部分的合适位置。

四、快速排序算法(Quick Sort)快速排序算法是一种高效的排序算法。

它采用了分治的思想,通过将数组分为较小和较大两部分,并递归地对两部分进行排序,最终达到整个数组有序的目的。

五、归并排序算法(Merge Sort)归并排序算法是一种高效的排序算法。

它采用了分治的思想,将数组一分为二,递归地对两个子数组进行排序,并将结果合并,最终得到有序的数组。

六、二分查找算法(Binary Search)二分查找算法是一种高效的查找算法。

它通过不断将查找范围折半,根据中间元素与目标值的大小关系,缩小查找范围,最终找到目标值所在的位置。

七、递归算法(Recursive Algorithm)递归算法是一种通过自我调用的方式解决问题的算法。

在C语言中,递归算法常用于解决树的遍历、问题分解等情况。

八、斐波那契数列算法(Fibonacci Sequence)斐波那契数列是一列数字,其中每个数字都是前两个数字的和。

C语言程序设计的常用算法

C语言程序设计的常用算法

C语言程序设计的常用算法1.排序算法-冒泡排序:通过多次比较和交换来将最大(小)的数移到最后(前),时间复杂度为O(n^2)。

适用于数据较少、数据基本有序的情况。

- 快速排序:通过一趟排序将待排序序列分隔成独立的两部分,其中一部分的所有元素都比另一部分的所有元素小。

然后递归地对两部分进行排序,时间复杂度为O(nlogn)。

适用于大规模数据的排序。

-插入排序:将待排序序列分为已排序和未排序两部分,每次从未排序部分取一个元素插入到已排序部分的适当位置,时间复杂度为O(n^2)。

适用于数据量较小的排序场景。

- 归并排序:将待排序序列分为若干个子序列,分别进行排序,然后再将排好序的子序列合并成整体有序的序列,时间复杂度为O(nlogn)。

适用于需要稳定排序且对内存空间要求不高的情况。

2.查找算法-顺序查找:从头到尾依次对每个元素进行比较,直到找到目标元素或者遍历完整个序列。

时间复杂度为O(n)。

- 二分查找:对于有序序列,将序列的中间元素与目标元素进行比较,根据比较结果缩小查找范围,直到找到目标元素或者查找范围为空。

时间复杂度为O(logn)。

3.图算法-广度优先(BFS):从给定的起始顶点开始,按照“先访问当前顶点的所有邻接顶点,再依次访问这些邻接顶点的所有未访问过的邻接顶点”的顺序逐层访问图中的所有顶点。

适用于寻找最短路径、连通性等问题。

-深度优先(DFS):从给定的起始顶点开始,按照“先递归访问当前顶点的一个邻接顶点,再递归访问这个邻接顶点的一个邻接顶点,直到无法再继续递归”的方式遍历图中的所有顶点。

适用于寻找路径、判断连通性等问题。

4.动态规划算法-背包问题:给定一个背包容量和一组物品的重量和价值,选择一些物品装入背包,使得装入的物品总重量不超过背包容量,且总价值最大。

利用动态规划的思想可以通过构建二维数组来解决该问题。

-最长公共子序列(LCS):给定两个序列,找出一个最长的子序列,且该子序列在两个原序列中的顺序保持一致。

C语言常用算法大全

C语言常用算法大全

C语言常用算法大全1.排序算法-冒泡排序:依次比较相邻的两个元素,如果顺序不对则交换,每轮找出一个最大或最小的元素-选择排序:从未排序的元素中选择最小或最大的放到已排序的最后,以此类推-插入排序:将未排序的元素插入到已排序的合适位置,从后向前进行比较和交换-快速排序:选择一个基准元素,将小于基准元素的放在左边,大于基准元素的放在右边,然后对左右两边递归地进行快速排序-归并排序:将待排序的序列不断划分为左右两部分,分别排序后再将排序好的左右两部分按顺序合并-堆排序:构建大顶堆,将堆顶元素与末尾元素交换,然后重新调整堆,重复这个过程直到排序完成2.查找算法-顺序查找:从给定的元素序列中逐个比较,直到找到目标元素或遍历完整个序列-二分查找:对于有序序列,在序列的中间位置比较目标元素和中间元素的大小关系,通过每次缩小一半的范围来查找目标元素-插值查找:根据目标元素与有序序列的最小值和最大值的比例推测目标元素所在的位置,然后递归地进行查找-斐波那契查找:根据斐波那契数列的性质来确定目标元素所在的位置,然后递归地进行查找3.图算法-深度优先(DFS):从图的一些顶点出发,依次访问其未被访问过的邻接顶点,直到所有顶点都被访问过为止-广度优先(BFS):从图的一些顶点出发,逐层遍历图的顶点,直到所有顶点都被访问过为止- 最小生成树算法:Prim算法和Kruskal算法,用于找到连接图中所有顶点的最小权值边,构成一棵包含所有顶点的生成树- 最短路径算法:Dijkstra算法和Floyd-Warshall算法,用于找到图中两个顶点之间的最短路径-拓扑排序:用于有向无环图(DAG)中的顶点排序,确保排序后的顶点满足所有依赖关系-关键路径算法:找出网络中的关键路径,即使整个工程完成的最短时间4.字符串算法- KMP算法:通过预处理模式串构建next数组,利用next数组在匹配过程中跳过一部分不可能匹配的子串- Boyer-Moore算法:从模式串的末尾开始匹配,利用坏字符和好后缀规则进行跳跃匹配- Rabin-Karp算法:利用哈希函数对主串和匹配串的子串进行哈希计算,然后比较哈希值是否相等- 字符串匹配算法:BM算法、Shift-And算法、Sunday算法等,用于寻找模式串在主串中的出现位置5.动态规划算法-最长公共子序列(LCS):用于寻找两个序列中最长的公共子序列-最长递增子序列(LIS):用于寻找给定序列中最长的递增子序列-0-1背包问题:将有限的物品放入容量为C的背包中,使得物品的总价值最大-最大子数组和:用于求解给定数组中连续子数组的最大和-最大正方形:在给定的0-1矩阵中,找出只包含1的最大正方形的边长这些算法是在C语言中常用的算法,它们涵盖了排序、查找、图、字符串和动态规划等多个领域。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言经典编程算法汇集(不断补充)用pi/4=1-1/3+1/5-1/7+...公式求PI的近似值,直到最后一项的绝对值小有10的-6次方为止。

#include <math.h>main(){int i=-1;float j,s=0.0;for(j=1.0;fabs(1.0/j)>=1e-6;j=j+2.0){i=-i;s+=i*1.0/j;}s=s*4.0;printf("%f\n",s);}输入四个整数,要求按由小到大的顺序输出。

main(){int a,b,c,d;printf("请输入4个整数:");scanf("%d,%d,%d,%d",&a,&b,&c,&d);printf("\n a=%d, b=%d, c=%d, d=%d \n",a,b,c,d);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(a>d){t=a;a=d;d=t;}if(b>c){t=b,b=c;c=t;}if(b>d){t=b;b=d;d=t;}if(c>d){t=c;c=d;d=t;}printf("排序结果如下:\n");printf("%d %d %d %d\n",a,b,c,d);}译密码。

为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。

例如,可以按以下规律电文变为密码:将字母A变成字母E,a变成e,即变成其后的第4个字母,W变成A,X变成B,Y变成C,Z变成D。

字母按上述规律转换,非字母字符不变。

如“China!”转换为“Glmre!”。

输入一行字符,要求输出其相应的密码。

#include <stdio.h>main(){char a,b[100];int i,j=0;printf("qing shu ru,yi hui che jie shu:");for(i=0;(b[i]=getchar())!='\n';i++){if((b[i]>='a'&&b[i]<='z')||(b[i]>='A'&&b[i]<='Z'))b[i]+=4;if(b[i]>'Z'&&b[i]<='Z'+4||b[i]>'z')b[i]=b[i]-26;}while(b[j]!='\0'){printf("%c",b[j]);j++;}}输入两个正整数m和n,求其最大公约数和最小公倍数。

main(){int p,r,n,m,temp;printf("请输入两个正整数n,m");scanf("%d,%d",&n,&m);if(n<m){temp=n;n=m;m=temp;}p=n*m;while(m!=0){r=n%m;n=m;m=r;}printf("它们的最大公约数为:%d\n",n);printf("它们的最小公倍数为:%d\n",p\n);}打印出所有的“水仙花数”。

所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。

例如,153是一个“水仙花数”,因为153=1的立方+5的立方+3的立方。

main(){int i,j,k,n;printf("水仙花"数是:");for(n=100;n<1000;n++){i=n/100;j=n/10-i*10;k=n%10;if(n==i*i*i+j*j*j+k*k*k)printf("%4d",n);}printf("\n");}两个乒乓球队进行比赛,各出三人。

甲队为A、B、C三人,乙队为X、Y、Z三人。

已抽签决定比赛名单。

有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比。

请编程序找出三对赛手的名单。

main(){char i,j,k;for(i='X';i<='Z';i++)for(j='X';j<='Z';j++)if(i!=j)for(k='X';k<='Z';k++)if(i!=k&&j!=k)if(i!='X'&&k!='X'&&k!='Z')printf("A--%c\tB--%c\tC--%c\n",i,j,k);}用起泡法对10个数排序(由小到大)。

main(){int a[10],t,i,j;printf("qing shu ru 10 ge shu:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=0;i<9;i++)for(j=0;j<9-i;j++)if(a[j]>=a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}for(i=0;i<10;i++)printf("%5d",a[i]);}输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

#include <stdio.h>main(){char string[81];int i,num=0,word=0;char c;gets(string);for(i=0;(c=string[i])!='\0';i++)if(c==' ')word=0;else if(word==0){word=1;num++;}printf("there are %d wprd in the line.\n",num);}用选择法对10个整数排序(从小到大)。

main(){int i,j,temp,a[11];printf("Enter data:\n");for(i=1;i<=10;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}printf("\n");for(i=1;i<=10;i++)printf("%5d",a[i]);printf("\n");for(i=1;i<=9;i++){for(j=i+1;j<=10;j++)if(a[i]>a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}printf("\nThe sorted numbers:\n");for(i=1;i<=10;i++)printf("%5d",a[i]);}将一个数组中的直按逆序重新存放。

列如原来顺序为:8、6、5、4、1。

要求改为:1、4、5、6、8。

#define N 5main(){int a[N],i,temp;printf("qing shu ru :");for(i=0;i<N;i++)scanf("%d",&a[i]);for(i=0;i<N/2;i++){temp=a[i];a[i]=a[N-i+1];a[N-i+1]=temp;}for(i=0;i<N;i++)printf("%4d",a[i]);printf("\n");}打印“打印魔方阵”,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。

要求打印1……平方的自然数构成的魔方阵。

main(){int a[16][16],i,j,k,p,m,n;p=1;while(p==1){printf("Enter n(n=1~15):");scanf("%d",&n);if((n!=0)&&(n<=15)&&(n%2!=0))p=0;}for(i=1;i<=n;i++)for(j=1;j<=n;j++)a[i][j]=0;j=n/2+1;a[1][j]=1;for(k=2;k<=n*n;k++){i=i-1;j=j+1;;if((i<1)&&(j>n)){i=i+2;j=j-1;}else{if(i<1)i=n;if(j>n)j=1;}if(a[i][j]==0)a[i][j]=k;else{i=i+2;j=j-1;a[i][j]=k;}for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%4d",a[i][j]);printf("\n");}}有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中(以两两交换的方式)。

main(){int a[11]={1,4,6,13,16,19,28,40,100};int temp1,temp2,number,end,i,j;printf("array a:\n");for(i=0;i<10;i++)printf("%5d",a[i]);printf("\n");printf("Insert data:");scanf("%d",&number);end=a[9];if(number>end)a[10]=number;else{for(i=0;i<10;i++){if(a[i]>number){temp1=a[i];a[i]=number;for(j=i+1;j<11;j++){temp2=a[j];a[j]=temp1;temp1=temp2;}break;}}}printf("Now,array a:\n");for(i=0;i<11;i++)printf("%6d",a[i]);}写一函数,输入一个4位数字,要求输出这4个数字字符,但每两个数字间有一个空格。

相关文档
最新文档