# week4 note
## c++ 內建sort
內建sort時間複雜度$O(nlogn)$
sort array
```cpp
int a[5] = {2, 5, 1, 4, 3};
sort(a, a + 5);
```
sort vector
``` cpp
vector<int> v = {10, 20, 30, 10, 5};
sort(v.begin(), v.end());
```
## 二分搜
時間複雜度$O(logn)$
二分搜的寫法很多種
* 聚會講的寫法
``` cpp
vector<int> v = {1, 4, 6, 7, 8, 12, 200};
int x = 8;
// 找第一個8>=的位置
int l = 0, r = v.size() - 1;
while (l < r) {
int mid = (l + r) / 2;
if(v[mid] < x) l = mid + 1;
else r = mid;
}
cout << l << endl;
```
> 如果不知道哪裡錯就印出(cout)l, r看看吧
* 另一個很猛的寫法
``` cpp
vector<int> v = {1, 4, 6, 7, 8, 12, 200};
int x = 8;
int k = 0;
for (int b = v.size()/2; b >= 1; b /= 2) {
while (k+b < n && v[k+b] <= x) k += b;
}
if (v[k] == x) {
// x found at index k
}
```
> 可以參考[CPH](https://cses.fi/book/book.pdf)裡的binary_search(page 31)
* c++ 內建function
``` cpp
vector<int> v = {1, 4, 6, 7, 8, 12, 200};
int x = 8;
// 第一個 >= x 的位置
int pos = lower_bound(v.begin(), v.end(), x) - v.begin();
```
* 費事數列程式碼
``` cpp
#include <bits/stdc++.h>
using namespace std;
// f0 = 1, f1 = 1, fn = fn-1+fn-2
int f(int n) {
cout << "in: " << n << endl;
int rt = 0;
if(n == 0 || n == 1) {
rt = 1;
} else {
rt = f(n-1) + f(n-2);
}
cout << "out: " << n << endl;
return rt;
}
int main() {
cout << f(4) << endl;
}
```