Merge Sort
How sort work?
array
[1 3 2 8 6 4 7 5]
[1 3 2 8 6 4 7 5]
sort(1,8)
[1 3 2 8 6 4 7 5]
sort(1,4)
[1 3 2 8 6 4 7 5]
sort(1,2)
[1 3 2 8 6 4 7 5]
sort(1, 1)
[1 3 2 8 6 4 7 5]
sort(2,2)
[1 3 2 8 6 4 7 5]
Merge(1,2)
[1 3 2 8 6 4 7 5]
sort(3,4)
[1 3 2 8 6 4 7 5]
sort(3,3)
[1 3 2 8 6 4 7 5]
sort(4,4)
[1 3 2 8 6 4 7 5]
Merge(3,4)
[1 2 3 8 6 4 7 5]
Merge(1,4)
略。
因為好累QAQ
How 遞迴 work?
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [6 4] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [6 4] [7 5]
[1][3][2][8] [6][4][7][5]
[1 2 3 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [3 8] [6 4] [7 5]
[1][3][3][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [6 4] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [6 4] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [4 6] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [4 6] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [4 6] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [4 6] [7 5]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [6 4 7 5]
[1 3] [2 8] [4 6] [5 7]
[1][3][2][8] [6][4][7][5]
[1 3 2 8 6 4 7 5]
[1 2 3 8] [4 5 6 7]
[1 3] [2 8] [4 6] [5 7]
[1][3][2][8] [6][4][7][5]
[1 2 3 4 5 6 7 8]
[1 2 3 8] [4 5 6 7]
[1 3] [2 8] [4 6] [5 7]
[1][3][2][8] [6][4][7][5]
Done
Time?
[1 3 2 8 6 4 7 5] -> N/1
[1 2 3 8] [6 4 7 5] -> N/2
[1 3] [2 8] [6 4] [7 5] -> N/4
[1][3][2][8] [6][4][7][5] -> N/8
level : 約log N層
2^x >= N
x >= log2 N
[1 3 2 8 6 4 7 5] -> 1
[1 2 3 8] [6 4 7 5] ->2
[1 3] [2 8] [6 4] [7 5] -> 4
[1][3][2][8] [6][4][7][5] -> 8
區間 : 大約 2*N 個
(1/1+1/2+1/4+1/8+...+1/N) * N
大約= 2 * N
[1 3 2 8 6 4 7 5] -> 8
[1 2 3 8] [6 4 7 5] -> 4+4
[1 3] [2 8] [6 4] [7 5] -> 2+2+2+2
[1][3][2][8] [6][4][7][5] -> None
Merge處理 : Nlog N
log N層
每層 N 個元素
呼叫2*N次 Sort(l, r);
呼叫N次 Merge(l, r);
Merge 處理 N log N 個元素
N log N > 2*N > N
O(N log N)
Extra
沒有異域法眼喔
useful skills
pointer
滑軌式
給定長度為N的 int 陣列 跟 int X
找到一個連續區間和
array[i] + array[i+1] + ... +array[j] <= X
而且最接近 X
example
X = 16
array = [7, 3, 4, 6, 1, 9, 3]
Ans
6 + 1 + 9 = 16
THINK
暴力列舉 L, R
O(N^2)
THINK
擴張區間
L ~ R --> L ~ R+1 --> L ~ R+2 ...
until...
總和 > X
THINK
考慮能夠擴張的最右界
1 ~ R1
2 ~ R2
3 ~ R3
...
...
R1 <= R2 <= R3 <= R4 .... <=RN
So?
算出 1 ~ R1 的總和sum後
只要
sum -= array[ 1 ]
我們就得到
2 ~R1
然後在算出
2~R2
THINK
當總和超出X時
一直把左邊的值刪掉
直到總和<=X
Then
把右邊的值加進來
直到總和 > X
更新最大值
Think
給你N件衣服的價格
M件褲子的價格
在預算X內
你有多少種
一件衣服+一件褲子的組合
Final
關於歸併樹?
等我學會XD
Merge Sort
Merge Sort
By rilak1328
Merge Sort
- 1,031