算法是計算或者解決問題的步驟,要想用計算機解決特定的問題,就要遵循算法。
特定問題多種多樣,比如“將隨意排列的數字按從小到大的順序重新排列”,“尋找出發點到目的地的最短路徑”,等等。
算法的步驟都是用數學方式來描述的,所以十分明確。
算法和程序有些相似,區別在於程序是以計算機能夠理解的編程語言編寫而成的,可以在計算機上運行,而算法是以人類能夠理解的方式描述的,用於編寫程序之前。不過,在這個過程中到哪里為止是算法、從哪里開始是程序,並沒有明確的界限。
就算使用同一個算法,編程語言不同,寫出來的程序也不同;即便使用相同的編程語言,寫程序的人不同,那么寫出來的程序也是不同的。
查找最小的數字並交換:選擇排序來看一個具體的算法示例吧。
這是一個以隨意排列的整數為輸入,把它們按從小到大的順序重新排列的問題。
只解決這一個問題很簡單,但是算法是可以應對任意輸入的計算步驟,所以必須采用通用的描述。
雖然在這個示例中輸入的整數個數n 為8,然而不管n 多大,算法都必須將問題解決。
那么,你首先想到的方法,是不是先從輸入的數字中找出最小的數字,再將它和最左邊的數字交換位置呢?在這個示例中就是找到最小數字1,然后將它和最左邊的7 交換位置。
這之后1 的位置便固定下來,不再移動。接下來,在剩下的數字里繼續尋找最小數,再將它和左邊第2 個數字交換位置。於是,4 和13 也交換了位置。
將這樣的一次交換稱為“1 輪”。到了第k 輪的時候,就把剩下的數字中最小的一個,與左邊開始第k 個數字進行交換。
於是在結束第k 輪后,從左數的k 個數字便都按從小到大的順序排列了。
只要將這個步驟重復n 次,那么所有的數字都將按從小到大的順序排列。
這便是選擇排序。
不管輸入的數字是什么、n 有多大,都可以用這個算法解決問題。
計算機擅長高速執行一些基本命令,但無法執行復雜的命令。此處的“基本命令”指的是“做加法”或者“在指定的內存地址上保存數據”等。
計算機是以這些基本命令的組合為基礎運行的,面對復雜的操作,也是通過搭配組合這些基本命令來應對的。上文中提到的“對n 個數字進行排序”對計算機來說就是復雜的操作。
如何設計算法來解決這個排序問題,也就等同於構思如何搭配組合計算機可以執行的那些基本命令來實現這個操作。