奧林匹亞資訊班
12/7
講師:吳崇維(wayne)
今日目標~
- 演算法!
- 泡沫排序
- 選擇排序
演算法
Algorithm!
演算法
對於一個固定形式的問題,
產生一套流程->
對於任何的輸入組合
皆能產生預期的答案!
推薦閱讀:)
輸入兩個整數,輸出較大者
這也是演算法~
固定:輸入兩個整數
輸出:兩個較大者
一套固定的輸入形式對應到答案!
如何分析一個演算法?
- 他跑得夠快嗎?
- 他夠節省嗎?
- 他的適應性夠好嗎?
演算法速度!
想一想:如果一行程式跑1單位時間
這個for跑了~?
for (int i = 0; i < 10000; i++) {
cout << "oops\n";
}
演算法速度!
想一想:如果一行程式跑1單位時間
那麼這個for跑了~?
for (int i = 0; i < N; i++) {
cout << "oops\n";
}
演算法速度!
想一想:如果一行程式跑1單位時間
還有這個for跑了~?
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << "oops\n";
}
}
for (int i = 0; i < 10000; i++) {
cout << "oops\n";
}
for (int i = 0; i < N; i++) {
cout << "oops\n";
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << "oops\n";
}
}
跑了10000次,是固定次數
又稱常數時間
跑了N次,隨著N變大次數變多
又稱線性時間
跑了N平方次隨著N變大次數變多,且增多的很快
電腦到底可以跑多快?
假設人腦作 x = x+1 要一秒鐘
則電腦一秒可以作
人腦需要作31年的速度!
電腦一秒可以跑 10^ 8 ~ 10 ^9
個指令!
演算法空間
例如:
a佔了100個int -> 400 bytes
b佔了10000個int -> 40000 bytes
int a[100];
int b[100][100];
平常不需要太注意空間
不要太誇張的大就好
Ex:
int a[100000000];
一定會爆XD
泡沫排序法
問題:排序一個陣列?
Ex: 1 5 3 4 2 -> 1 2 3 4 5
初次接觸演算法
思路:先把最大的放到後面
接著再放第二大的...排序完所有數字!
如何把實際想法換成程式呢?
本次作業:看影片,資料!
將思路轉換成邏輯程式
引導你們寫出泡沫算法!
step 1: 先想想
如何將最大的元素放到最後面
=>
練習1 : 給你一些數字,把最大的數字慢慢換到最後面
EX:
2 4 5 1 3 => 2 4 1 3 5
step 2: 先想想
最大的元素放到最後面後
=>
剩下一個子問題!
不管最後端的5了~
EX:
2 4 5 1 3 => 2 4 1 3 5
=> 2 4 1 3
step 3: 遞到底
慢慢把縮小問題範圍!直到剩下1
EX:
2 4 5 1 3
=> 2 4 1 3 5
=> 2 1 3 4 5
=> 2 1 3 4 5
=> 1 2 3 4 5
=> 1 2 3 4 5
使用雙層迴圈
試試看自己寫出泡沫排序!
'分析泡沫排序法'
Green: b019
選擇排序法
step 1: 先想想
如何將最大的元素放到最後面
=>
給你一些數字,
找出最大的數字
EX:
2 4 5 1 3 => 5
step 2: 交換
找出最大元素後,放到最後面
EX:
2 4 5 1 3 => 5
=> 2 4 3 1 5
step 3: 遞到底
慢慢把縮小問題範圍!直到剩下1
EX:
2 4 5 1 3
=> 2 4 3 1 5
=> 2 1 3 4 5
=> 2 1 3 4 5
=> 1 2 3 4 5
=> 1 2 3 4 5
今日作業~
寫出選擇排序!
注意:必須要符合選擇排序的精神,不僅僅是排序完成
FeedBack!
一起努力快樂寫程式吧!
class 12/7 泡沫排序法
By Wayne Wu
class 12/7 泡沫排序法
- 49