C语言从入门到精通(第5版)
上QQ阅读APP看书,第一时间看更新

2.1 算法的基本概念

算法与程序设计及数据结构密切相关,是解决一个问题的完整的步骤描述,更是解决这个问题的策略、规则和方法。算法的描述形式有很多种,如传统流程图、结构化流程图及计算机程序语言等,下面就介绍算法的一些相关内容。

2.1.1 算法的特性

算法是为解决某一特定类型的问题而制定的一个实现过程,它具有下列特性。

1.有穷性

一个算法必须在执行有穷步之后结束,且每一步都可在有穷时间内完成,不能无限地执行下去。如要编写一个由小到大整数累加的程序,就需要给出整数的上限,也就是加到哪个数为止。若没有上限,那么程序将无终止地运行下去,进入死循环。

2.确定性

算法的每一个步骤都应当有确切定义,每一个过程都不能有二义性,必须对将要执行的每个动作做出严格而清楚的规定。

3.可行性

算法中的每一步都应当能有效地运行,也就是说算法是可执行的,并能够最终得到正确的结果。如下面一段程序:

在这段代码中,“z=x/y;”就是一个无效的语句,因为0不可以做分母。

4.输入

一个算法应有零个或多个输入。输入就是执行算法时需要从外界取得的一些必要的(如算法所需的初始量等)信息。例如:

int a,b,c;
scanf("%d,%d,%d",&a,&b,&c);

上面的代码中有3个输入。又如:

上面的代码需要零个输入。

5.输出

一个算法应有一个或多个输出。什么是输出?输出就是算法最终所求的结果。编写程序的目的就是要得到一个结果,如果一个程序运行下来没有任何结果,那么这个程序本身也就失去了意义。

误区警示

需要注意的是:一个程序,可能存在输入,也可能不存在输入,但一定存在输出。也就是说,至少存在一个输出。

2.1.2 算法的优劣

衡量一个算法的好坏,通常要从以下几个方面来分析。

1.正确性

正确性是指所写的算法应能满足具体问题的要求,即对任何合法的输入,算法都会得出正确的结果。

2.可读性

可读性是指算法被写好之后,该算法被理解的难易程度。一个算法可读性的好坏十分重要,如果一个算法比较抽象,难以理解,那么这个算法就不易于进行交流和推广使用,其后续修改、扩展、维护都十分不方便。因此在写一个算法时,要尽量将该算法写得简明、易懂。

3.健壮性

一个程序完成后,运行该程序的用户对程序的理解各有不同,并不能保证每一个人都能按照要求进行输入。健壮性就是指当输入的数据非法时,算法也会做出相应判断,而不会因为输入的错误造成瘫痪。

4.时间复杂度与空间复杂度

简单地说,时间复杂度就是算法运行所需要的时间。不同的算法具有不同的时间复杂度,当一个程序较小时,会感觉不到时间复杂度的重要性;但当一个程序特别大时,时间复杂度实际上是十分重要的。因此,如何写出更高速的算法一直是算法优化的目标。空间复杂度是指算法运行时所需的存储空间的大小。随着计算机硬件的发展,空间复杂度已经不再显得那么重要。