or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
排序與搜尋
排序與搜尋
複習
STL
最常用
某些演算法會用到(暫時先跳過)
vector
可以把它當成 array 的用法,而且他是有序的,所以可以用 vec[i]。
push_back()
設置大小
pop_back()/empty()
二維vector
function
用 STL 傳進函式會很方便,像是 string 和 char 差別
差別?
那要怎麼讓 vector 也可以改值?
reference
Reference 就像就像別名一樣,改個名字而已,但實際引用是同一個
fill
想把 vector 裡面設定一個數字 需 O(n) 時間
set
用法
map
用法
find 指標
和尋找有關的指令,都會回傳一個 pointer
清空
目前學到的STL支援 clear() 用法
注意不是把內容物設 0, 而是回到原始的空容器
常用小工具
min/max
swap()
__gcd()
abs()
sqrt()
取整
排序演算法
Selection Sort
反覆從未排序的資料中找出最大(小)值,與最前端尚未排序的資料交換。
實作 \(O(n^2)\)
Bubble Sort
原理是從第一筆資料開始,比較相鄰兩筆資料,如果兩筆大小順序有誤則做交換,反之則不動,接者再進行下一筆資料比較,所有資料比較完第1回合後,可以確保最後一筆資料是正確的位置。
實作 \(O(n^2)\)
Insertion Sort
原理是逐一將原始資料加入已排序好資料中,並逐一與已排序好的資料作比較,找到對的位置插入。
實作 \(O(n^2)\)
練習
使用以上三種其中一種試試看
Merge Sort
將資料分割成兩部分,再把分割的部分再分割成兩部分,直到每個部份都剩下2個以下,再回頭將這些部分合併。
時間複雜度 \(O(nlogn)\)
實作的部分,因為是使用分治法,所以會在分治那篇做實作,先知道原理就好,在排序的部分很少會自己刻了。
快速排序法
在混亂的資料中,快速排序是目前公認效率極佳的演算法,原理是先從原始資料列中找一個基準值(Pivot),接著逐一將資料與基準值比較,小於基準值的資料放在左邊,大於基準值的資料放在右邊,再將兩邊區塊分別再找出基準值,重複前面的步驟,直到排序完為止。
時間複雜度 \(O(nlogn)\)
操作流程:
實作的部分,同樣是使用分治法,所以會在分治那篇做實作,先知道原理就好,在排序的部分很少會自己刻了。
內建排序 sort ☆☆☆☆☆
實作
如果不寫比較函數,預設就是由小排到大
比較函數 cmp
實作
實作II
答案
練習
提示: (會用其他型態的也可以 ex: struct) 下次再教
搜尋演算法
想要在資料裡面,找到某個值在哪
線性搜尋
最簡單也最爆力的方法,直接走訪每個元素,找要的值。
舉例來說,想知道班上考X分的那個人是誰。 (用pair存名字和分數)
二分搜尋
針對 "以排序好" 的資料,做二分的動作。 但請不要認為這很容易,這是很多人很苦惱的地方,因為邊界的判斷以及判斷的方法其實很難掌握。
會遇到的問題?
你可能第一次看到二分,會寫出以下程式碼
會遇到的問題?
方法一
針對修改邊界做一點處理
方法二
方法三
有人會稱之 跳跳二分搜
時間複雜度 \(O(logn)\)
練習
內建二分搜
注意
挑戰題