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 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

By rilak1328

Merge Sort

  • 913