奧林匹亞資訊班

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!

一起努力快樂寫程式吧!

Made with Slides.com