算法是计算或者解决问题的步骤,要想用计算机解决特定的问题,就要遵循算法。
特定问题多种多样,比如“将随意排列的数字按从小到大的顺序重新排列”,“寻找出发点到目的地的最短路径”,等等。
算法的步骤都是用数学方式来描述的,所以十分明确。
算法和程序有些相似,区别在于程序是以计算机能够理解的编程语言编写而成的,可以在计算机上运行,而算法是以人类能够理解的方式描述的,用于编写程序之前。不过,在这个过程中到哪里为止是算法、从哪里开始是程序,并没有明确的界限。
就算使用同一个算法,编程语言不同,写出来的程序也不同;即便使用相同的编程语言,写程序的人不同,那么写出来的程序也是不同的。
查找最小的数字并交换:选择排序来看一个具体的算法示例吧。
这是一个以随意排列的整数为输入,把它们按从小到大的顺序重新排列的问题。
只解决这一个问题很简单,但是算法是可以应对任意输入的计算步骤,所以必须采用通用的描述。
虽然在这个示例中输入的整数个数n 为8,然而不管n 多大,算法都必须将问题解决。
那么,你首先想到的方法,是不是先从输入的数字中找出最小的数字,再将它和最左边的数字交换位置呢?在这个示例中就是找到最小数字1,然后将它和最左边的7 交换位置。
这之后1 的位置便固定下来,不再移动。接下来,在剩下的数字里继续寻找最小数,再将它和左边第2 个数字交换位置。于是,4 和13 也交换了位置。
将这样的一次交换称为“1 轮”。到了第k 轮的时候,就把剩下的数字中最小的一个,与左边开始第k 个数字进行交换。
于是在结束第k 轮后,从左数的k 个数字便都按从小到大的顺序排列了。
只要将这个步骤重复n 次,那么所有的数字都将按从小到大的顺序排列。
这便是选择排序。
不管输入的数字是什么、n 有多大,都可以用这个算法解决问题。
计算机擅长高速执行一些基本命令,但无法执行复杂的命令。此处的“基本命令”指的是“做加法”或者“在指定的内存地址上保存数据”等。
计算机是以这些基本命令的组合为基础运行的,面对复杂的操作,也是通过搭配组合这些基本命令来应对的。上文中提到的“对n 个数字进行排序”对计算机来说就是复杂的操作。
如何设计算法来解决这个排序问题,也就等同于构思如何搭配组合计算机可以执行的那些基本命令来实现这个操作。