❶ c语言常用算法有哪些
0) 穷举法
穷举法简单粗暴,没有什么问题是搞不定的,只要你肯花时间。同时对于小数据量,穷举法就是最优秀的算法。就像太祖长拳,简单,人人都能会,能解决问题,但是与真正的高手过招,就颓了。
1) 贪婪算法
贪婪算法可以获取到问题的局部最优解,不一定能获取到全局最优解,同时获取最优解的好坏要看贪婪策略的选择。特点就是简单,能获取到局部最优解。就像打狗棍法,同一套棍法,洪七公和鲁有脚的水平就差太多了,因此同样是贪婪算法,不同的贪婪策略会导致得到差异非常大的结果。
2) 动态规划算法
当最优化问题具有重复子问题和最优子结构的时候,就是动态规划出场的时候了。动态规划算法的核心就是提供了一个memory来缓存重复子问题的结果,避免了递归的过程中的大量的重复计算。动态规划算法的难点在于怎么将问题转化为能够利用动态规划算法来解决。当重复子问题的数目比较小时,动态规划的效果也会很差。如果问题存在大量的重复子问题的话,那么动态规划对于效率的提高是非常恐怖的。就像斗转星移武功,对手强它也会比较强,对手若,他也会比较弱。
3)分治算法
分治算法的逻辑更简单了,就是一个词,分而治之。分治算法就是把一个大的问题分为若干个子问题,然后在子问题继续向下分,一直到base cases,通过base cases的解决,一步步向上,最终解决最初的大问题。分治算法是递归的典型应用。
4) 回溯算法
回溯算法是深度优先策略的典型应用,回溯算法就是沿着一条路向下走,如果此路不同了,则回溯到上一个
分岔路,在选一条路走,一直这样递归下去,直到遍历万所有的路径。八皇后问题是回溯算法的一个经典问题,还有一个经典的应用场景就是迷宫问题。
5) 分支限界算法
回溯算法是深度优先,那么分支限界法就是广度优先的一个经典的例子。回溯法一般来说是遍历整个解空间,获取问题的所有解,而分支限界法则是获取一个解(一般来说要获取最优解)。
❷ C语言常用算法中,查找无序数列的算法有哪些
可以用排序+折半查找 代码如下,编译软件DEV C++通过,要查找多少个数只要改一下宏定义就可以了另外要是再优化可以把排序的算法改一改#define A 10
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,a[A],j,t,b,min,mid,max,p[A],k;
p[0]=1; p[1]=2; p[2]=3; p[3]=4; p[4]=5; p[5]=6; p[6]=7; p[7]=8; p[8]=9; p[9]=10;
printf("请输入%d个数\n",A);
for(i=0;i<A;i++)
scanf("%d",&a[i]);
for(i=0;i<A;i++)
for(j=i+1;j<A;j++)
if(a[i]>a[j])
{ t=a[i];
k=p[i];
a[i]=a[j];
p[i]=p[j];
a[i]=t;
p[i]=k;
}
printf("请输入要查找的数字\n");
scanf("%d",&b);
min=0;
mid=A/2;
max=A-1;
for(i=0;i<A;i++)
{if(b==a[min]) {printf("您所输入的数为第%d个\n",p[min]); break;}
if(b==a[max]) {printf("您所输入的数为第%d个\n",p[max]); break;}
if(b==a[mid]) {printf("您所输入的数为第%d个\n",p[mid]); break;}
if(min>=max) {printf("ERROR 您所输入的数字%d不在此数组内"); break;}
if(b>a[mid])
{min=mid;<br> mid=(min+max)/2;}
if(b<a[mid])
{ max=mid;
mid=(max+min)/2;}
}
system("pause");
}
❸ 时间片轮转调度算法C语言实现
时间片轮转调度算法是一种操作系统中常用的进程调度策略。它通过设定一个固定的时间片长度,比如10毫秒,来轮换执行不同的进程。具体实现中,可以使用定时器来精确控制时间片的长度。当定时器到期时,会触发一个中断,此时系统会保存当前进程的上下文信息,包括程序计数器(PC)和其他关键寄存器的值到栈中,然后跳转到下一个进程的执行地址。
这样的调度方式可以确保每个进程都有机会在有限的时间内获得处理器资源。当一个进程的时间片耗尽时,系统会暂时将其挂起,并将控制权转交给下一个进程。这个过程会不断重复,直到所有进程都完成了它们的任务。时间片轮转算法的一个显着特点是,它能够提供较好的响应时间和公平性,尤其是在处理交互型和短进程时。
在C语言中实现时间片轮转调度算法,首先需要初始化定时器和进程任务队列。每个任务都包含必要的上下文信息,如PC地址、优先级等。每次定时器触发时,调度器会检查当前进程的时间片是否已经用完。如果用完了,就将当前进程的信息保存到栈中,并切换到下一个进程。这个过程需要保证进程切换的平滑进行,避免数据丢失或系统崩溃。
为了实现这一算法,通常需要编写一些核心的函数,比如初始化函数、任务调度函数和定时器中断处理函数。初始化函数负责设置定时器和任务队列,任务调度函数负责根据时间片长度决定何时切换到下一个任务,而定时器中断处理函数则负责保存当前任务的状态并切换到下一个任务。
时间片轮转调度算法不仅在操作系统中有着广泛的应用,也可以用于其他需要动态分配资源的场景。通过合理设置时间片长度,可以有效提高系统的整体效率和响应速度。