什么是算法?
算法是指解决问题或完成任务的一系列明确步骤。它就像一个食谱,指导我们一步步完成某个菜肴,或者像一个地图,指引我们从一个地方到达另一个地方。每一步都是具体的,必须遵循这些步骤才能确保最终目标的实现。
算法的基本特性
-
确定性(Determinism):
每个步骤都要明确,不能有歧义。举个例子,就像做饭时,食谱上说“加一勺盐”,这个“勺”需要明确具体的量,比如“一茶匙”还是“一汤匙”,否则会影响最终的味道。 -
有穷性(Finiteness):
算法必须在有限的时间内完成。想象一下,如果我们设计了一种烹饪方法,但它需要不停地搅拌永远不停止,那我们永远也吃不上这道菜。 -
输入(Input):
算法应该有零个或多个输入。这些输入是算法开始执行前需要的外部信息或数据。比如在烘焙蛋糕时,面粉、糖、鸡蛋就是我们的输入材料。 -
输出(Output):
算法至少有一个输出。就像烤蛋糕,最终我们要得到的是一个美味的蛋糕。 -
可行性(Feasibility):
算法中的每个步骤都应该是可行的,也就是说,能够在有限时间内通过人工或计算机来实现。比如,食谱里的步骤“加热至太阳表面温度”就是不可行的,因为我们根本无法实现。 -
高效性(Efficiency)(该特性不属于算法五大特性):
一个好的算法应该在时间和空间上都具有高效性,即尽量减少计算时间和所需存储空间。就像在厨房里,我们希望在最短的时间内用最少的工具做出最好的菜。
例子:冒泡排序算法
冒泡排序是一种简单但经典的排序算法。我们可以用一个生动的比喻来理解它。
关于C语言的冒泡排序可点击此处查看
冒泡排序的过程:
想象我们在池塘里捞了几条鱼,这些鱼的体型大小不一。我们希望按照从小到大的顺序把它们排成一排。
-
第一步:
- 我们拿起第一条鱼和第二条鱼,比较它们的大小。如果第一条鱼比第二条大,我们就交换它们的位置,让较小的鱼在前。
- 然后,我们拿第二条和第三条鱼继续比较,再交换它们的位置,如此类推,直到最后一条鱼。
-
第二步:
- 第一轮结束后,最大的鱼已经被交换到最后的位置。
- 现在,重复第一步,但这次我们只需比较到倒数第二条鱼,因为最后一条鱼已经是最大的了。
-
重复步骤:
- 继续这样比较和交换,逐步把剩下的鱼排好位置。
冒泡排序的伪代码:
procedure bubbleSort(A: list of sortable items)
n := length(A)
repeat
swapped := false
for i := 1 to n-1 inclusive do
if A[i-1] > A[i] then
swap(A[i-1], A[i])
swapped := true
end if
end for
n := n - 1
until not swapped
end procedure
冒泡排序的特性解释:
- 确定性:每次执行冒泡排序,比较和交换的步骤都是确定的,没有任何随机成分。
- 有穷性:冒泡排序在有限的步骤后会完成。不会无限地比较和交换下去,因为每轮会把一个最大值固定下来。
- 输入:需要排序的一列数或对象,比如一组鱼的大小。
- 输出:已经排序好的一列数或对象。
- 可行性:每一步都是简单的比较和交换,任何人或计算机都能轻松实现。
- 高效性:虽然冒泡排序简单,但对于大规模数据,它并不高效,时间复杂度是 O(n^2)。但是对于小规模数据或者教学目的,它是一个很好的示例。