不少開發者都知道「程序=數據結構+算法」這個著名的公式,單曲並不真正明白算法的定義或概念。究竟什麼是算法呢?從字面意義上理解,算法即用於計算的方法,經過這種方法能夠達到預期的計算結果。java
一個典型的算法通常均可以從中抽象出5個特徵:又窮性、確切性、輸入、輸出和可行性。下面詳細分析這5個特徵。算法
算法是一門古老且龐大的學科,隨着歷史的發展,演化出多種多樣的算法。按照不一樣的應用和特性,算法能夠分爲不一樣的類別。編程
按照算法的應用領域,即解決的問題,算法能夠分爲基本算法、數據結構相關的算法、幾何算法、圖論算法、規劃算法、數值算法、數值分析算法、加密/解密算法、排序算法、查找算法、並行算法和數論算法等。數組
按照算法結果的肯定性來分類,算法能夠分爲肯定性算法和非肯定性算法。數據結構
按照算法的思路來分類,算法能夠分爲遞推算法、遞歸算法、窮舉算法、貪婪算法、分治算法、動態規劃算法和迭代算法等多種算法。性能
數據結構是數據的組織形式,能夠用來表徵特定的對象數據。在計算機程序設置中,操做的對象是各式各樣的數據,這些數據每每擁有不一樣的數據結構,如數組、結構體、聯合、指針和鏈表等。由於不一樣的數據結構所採用的處理方法不一樣,計算的複雜度也不一樣,因材算法每每依賴於某種數據結構。也就是說,數據結構的算法實現的基礎。(程序=數據結構+算法)加密
數據結構spa
流程圖是一種圖形表示算法流程的方法,其由一些圖框和流程線組成。其中,圖框標識各類操做的類型,圖框中的文字和符號標識該操做的內容,流程線表示操做的前後次序。圖框以下:指針
在實際使用中,通常採用以下三種流程結構。code
順序結構是最簡單 的一種流程結構,簡單的一個接着一個的進行處理,通常來講,順序結構數和於簡單的算法。
分支結構經常使用語根據某個條件來決定算法的走向,以下所示。這裏首先判斷條件P,若是P成立,則執行B;否者執行A,而後在繼續下面的算法。分支結構有時也稱爲條件結構。
通常來講,採用上述三種流程結構,能夠完成全部的算法任務。經過合理安排流程結構,能夠構成結構化的程序,這樣便於算法程序的開發和交流。
算法其實就是解決問題的一種方法,一個問題的解決每每能夠採用多種方法,但每種方法所用的時間和獲得的效果每每是不同的。算法的一個重要任務即是找到合適的、效率最高的解決問題的方法,即最好的算法。從理論上來說,這就須要對算法的性能有一個合理的評論。一個算法的優劣每每經過算法複雜度來衡量,算法複雜度包括時間複雜度和空間複雜度兩個方面。
時間複雜度即一般所說的算法執行所須要耗費的時間,時間越短,算法越好。一個算法執行的時間每每沒法精確估計,一般須要在實際的計算機中運行纔可以知道。可是,也能夠對算法的代碼進行估計,而獲得算法的時間複雜度。
空間複雜度是指算法程序在計算機中執行所消耗的存儲空間。空間複雜度能夠分爲以下兩個方面。
1)程序保存所須要的存儲空間,即程序大小。
2) 程序在執行中所須要小號的存儲空間資源,如程序在執行過程當中的中間變量等。
通常來講,程序的大小越小,執行過程當中消耗的資源越少,這對程序就越好。
public static void main(String[] args) { /** * 使用while循環來計算1+2+3+....+100的值 */ int current= 1;//從1開始累加 int total = 0;//累加數 while (current<=100){ total+=current; current++; } System.out.println(total); }
效果以下:
5050
public static void main(String[] args) { /** * 將ASCII碼位於32~126之間的95個字符顯示在屏幕上,爲了美觀,要求小於100的碼值前填充一個0,每行打印8個字符。 */ String temp = ""; for (int i = 32; i <= 126; i++) { temp = i<100?("0"+i):(i+""); System.out.print(temp+ "=" +(char) i+" "); if ((i-31)%8 ==0){ System.out.println("\n"); } }
效果以下:
032= 033=! 034=" 035=# 036=$ 037=% 038=& 039=' 040=( 041=) 042=* 043=+ 044=, 045=- 046=. 047=/ 048=0 049=1 050=2 051=3 052=4 053=5 054=6 055=7 056=8 057=9 058=: 059=; 060=< 061== 062=> 063=? 064=@ 065=A 066=B 067=C 068=D 069=E 070=F 071=G 072=H 073=I 074=J 075=K 076=L 077=M 078=N 079=O 080=P 081=Q 082=R 083=S 084=T 085=U 086=V 087=W 088=X 089=Y 090=Z 091=[ 092=\ 093=] 094=^ 095=_ 096=` 097=a 098=b 099=c 100=d 101=e 102=f 103=g 104=h 105=i 106=j 107=k 108=l 109=m 110=n 111=o 112=p 113=q 114=r 115=s 116=t 117=u 118=v 119=w 120=x 121=y 122=z 123={ 124=| 125=} 126=~
public static void main(String[] args) { /** * 使用for循環的嵌套,打印出九九乘法表 */ for (int i = 1; i <= 9 ; i++) { for (int j = 1; j <= i ; j++) { System.out.print(j+"*"+i+"="+i*j+"\t"); } System.out.println(""); } }
效果以下:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81