有一天你突然要存三個整數
int main(){ int val_1,val_2,val_3; }
如果要存10^6個整數呢?
int main(){ int val_1,val_2,...,val_1000000; }等code完應該都已經天黑了吧...
int a[1000000]; int main(){ int i,n,x; scanf("%d",&n); for(i = 0 ; i < n ; i ++ ) scanf("%d",&a[i]); printf("%d",a[x]); }
輸入n個整數把這n個數由小到大排序怎麼做呢?
看一下n比較小的情況吧
假設現在 n=3 好了
反正 n=3 時也才 3!=6 種case而已,就if一一討論吧
不只要把一棵樹序列化,還希望一個子樹就對應到一個區間。if 討論 ?10000! = 2.84625968091705451890641321211986889014805140170279... × 10^35659很瘟腥對吧
想像一下現在你有10顆球,1編號1~10,請你幫我把它們由小到大排
你會...
具體作法就是從每次現有的k個元素中取最小(大)值,放到最左邊後繼續做剩下的k-1個元素
Selection Sort
int a[10000]; int main(){ int i,j,n,tmp; for(i = 0 ; i < n-1 ; i ++ ){ for(j = i+1 ; j< n ; j++){ if(a[i]>a[j]){ tmp=a[i]; //變數變換很重要喔 a[i]=a[j]; a[j]=tmp; } } } }
來看一點進階觀念
假設電腦在做加減乘除與賦值運算所花的時間是一樣的一個演算法可以定義他所需的計算次數我們又稱他做"時間複雜度"
而在資訊競賽中我們口中常說的複雜度是一個演算法在 "最差情況下" 所需的計算次數假設某個演算法在最差情況下須進行k次運算我們就將它的複雜度表示為 O(k)
回到selection sort 我們仔細算一下發現他最差約需要交換 n(n-1)/2 次
而我們假設n超大此時 n(n-1)/2 近似於 n^2我們說選擇排序法的複雜度是O(n^2)
複雜度分析是資訊競賽中相當重要的一環其中又分為空間和時間複雜度而一個演算法的快慢就是由時間複雜度影響以剛剛的排序法來說,除了O(n^2)外還有其他算法有O(nlogn)的複雜度當n到10^6次方時n^2和nlogn的運算時間在一般電腦上運行可以相差10000多秒
更多有關時間複雜度內容的可以自行去查資料