![零基础学C语言(升级版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/970/49639970/b_49639970.jpg)
2.1 算法的基本概念
算法与程序设计以及数据结构密切相关,它是解决一个问题的完整步骤的描述,是解决问题的策略、规则和方法。正如著名计算机科学家Nkiklaus Wirth(尼克劳斯·沃斯)提出的公式:
数据结构+算法=程序
如果把程序比作一个人,那么数据结构就是人的躯体,而算法就是人的灵魂。所以说,算法是程序不可缺少的部分。算法的描述形式有很多种,例如,传统流程图、结构化流程图及计算机程序语言等。下面具体介绍算法的几个特性,并分析一个好的算法应该具备哪些特点。
2.1.1 算法的特性
![](https://epubservercos.yuewen.com/D4D811/29142692003378706/epubprivate/OEBPS/Images/txt003_3.jpg?sign=1738878968-QgwhIU67TvffUamD6uzUmxBVAS9TozHF-0-a6e5b516a99c712d068fb893f46ceac1)
视频讲解:资源包\Video\02\2.1.1算法的特性.mp4
算法是为解决某一特定类型的问题而设计的一个实现过程,它具有下列特性。
(1)有穷性
一个算法必须在执行有穷步之后结束,并且每一步都在有穷时间内完成,不能无限地执行下去。就像图2.1所示的数学中的线段一样,有起点,也有终点,不能无限地延长。
例如,要编写一个由小到大的整数累加的程序,这时要注意一定要设一个整数的上限,若没有这个上限,那么程序将无终止地运行下去,也就是常说的“死循环”。
(2)确定性
算法的每一个步骤都应当是有确切定义的,对于每一个过程都不能有二义性,对将要执行的每个动作必须做出严格而清楚的规定。
(3)可行性
算法中的每一步都应当能有效地运行,也就是说,算法是可执行的,并要求最终得到正确的结果。例如,如图2.2所示的这段程序,代码中的“z=x/y;”就是一个无效的语句,因为0是不可以做分母的。
![](https://epubservercos.yuewen.com/D4D811/29142692003378706/epubprivate/OEBPS/Images/txt003_4.jpg?sign=1738878968-oNtgmFnOINm8XUffVvHFeQNnfeBo1bgY-0-db00c88a28d292d73b015faf2e126998)
图2.1 线段
![](https://epubservercos.yuewen.com/D4D811/29142692003378706/epubprivate/OEBPS/Images/txt003_5.jpg?sign=1738878968-5hX2TTaqSJ63mqfmsGXBP6Ku8Av7dhTg-0-8f12edb56eb461f644f75243fd2e7294)
图2.2 不可执行的代码
(4)有输入
一个算法可以有一个或多个输入,也可以没有输入,输入就是在执行算法时有必要从外界获取的,如算法所需的初始量等一些信息。例如:
![](https://epubservercos.yuewen.com/D4D811/29142692003378706/epubprivate/OEBPS/Images/txt003_6.jpg?sign=1738878968-8pzXCrE1vnS5W0rlaKJX4MXpfl3BhzJs-0-92b1e1989c1eb9165e67c13b4ea3f05b)
(5)有输出
一个算法有一个或多个输出,输出就是算法最终所求的结果。编写程序的目的就是要得到一个结果。例如,在控制台输出“MingRi”,如图2.3所示。
![](https://epubservercos.yuewen.com/D4D811/29142692003378706/epubprivate/OEBPS/Images/txt003_7.jpg?sign=1738878968-A3krhcPRCpspfD6AXJTxGc1euvS3Imd4-0-b34c66815cb99ac72da6399137351a92)
图2.3 在控制台上输出的结果
如果一个程序运行下来没有任何结果,那么这个程序本身也就失去了意义。
2.1.2 算法的优劣
![](https://epubservercos.yuewen.com/D4D811/29142692003378706/epubprivate/OEBPS/Images/txt003_8.jpg?sign=1738878968-MNE238EypF0PFxx1BxDoaUzVRy7bb8qR-0-27c73e580c54deb05c0510f43a0035ec)
视频讲解:资源包\Video\02\2.1.2算法的优劣.mp4
衡量一个算法的好坏,通常要从以下几个方面来分析。
(1)正确性,即所写的算法能满足具体问题的要求,即对任何合法的输入,算法都会得出正确的结果。
(2)可读性,是指算法被写好之后,该算法被理解的难易程度。一个算法可读性的好坏十分重要,如果一个算法比较抽象,难于理解,那么这个算法就不易被交流和推广使用,对于修改、扩展及维护都十分不方便。因此在写一个算法时,要尽量将该算法写得简明易懂。例如,汉字的繁体字和简体字,繁体字书写麻烦,笔画太多,而且难记,但简体字书写简单,可读性好。
(3)健壮性,是指当输入的数据非法时,算法也会做出相应判断,而不会因为输入错误造成程序“瘫痪”。
(4)时间复杂度与空间复杂度。简单地说,时间复杂度就是算法运行所需要的时间。不同的算法具有不同的时间复杂度,当一个程序较简单时,可能感觉不到时间复杂度的重要性;当一个程序特别复杂时,便会察觉到时间复杂度实际上是十分重要的。因此,写出更高效的算法一直是改进的目标。空间复杂度是指算法运行所需的存储空间的多少。