# **作業 4 演算法之條條大路通羅馬**
>**作者:林芸筠**
>**學號:D1225529**
>**Email : d1225529@o365.fcu.edu.tw**
---
## 搜尋演算法
[704. Binary Search](https://leetcode.com/problems/binary-search/solutions/)
---
### 二元搜尋法
```
int guessNumber(int n){
int left = 1;
int right = n;
while (left <= right){
int mid = left + (right - left) / 2;
int result = guess(mid);
if (result == 0){
return mid;
}
else if( result == -1)
{
right = mid - 1;
}
else
left = mid + 1;
}
return -1;
}
```
取中間值並將非目標值的範圍淘汰,不斷循環直到找出正解
---
## 線性搜尋法
```
int search(vector<int>& nums, int target) {
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == target) {
return i;
}
}
return -1;
}
```
簡單直接的去找尋目標值
---
## 排序演算法
[912. Sort an Array](https://leetcode.com/problems/sort-an-array/)
---
### Bubble sort(泡沫排序法)
```
void bubbleSort(vector<int>& nums){
for(int i = nums.size() - 1; i >= 0; i--)
for(int j = 0; j < i; j++)
if(nums[j] > nums[j + 1])
swap(nums[j], nums[j + 1]);
}
```
先由左至右兩兩一組比大小,將大的往右邊排,重複執行直到結束
---
### Insertion sort(插入排序法)
```
void insertionSort(vector<int>& nums){
if(nums.size() == 0 || nums.size() == 1) return;
for(int i = 1; i < nums.size(); i++){
int tmp = nums[i];
int j = i - 1;
while(j >= 0 && nums[j] > tmp){
nums[j + 1] = nums[j];
j--;
}
nums[j + 1] = tmp;
}
}
```
將目標值有順序的插入有序數列
---
### Quick sort (快速排序法)
```
void quickSort(vector<int>& nums, int l, int r){
if(l >= r) return;
int i = l; // cursor for final pivot location
for(int j = l; j <= r - 1; j++){ // nums[r] is chosen as the pivot
if(nums[j] <= nums[r]){
swap(nums[i], nums[j]);
i++; // smaller or equal elements go to the left of i
}
}
swap(nums[i], nums[r]); // after swap, the pivot is nums[i]
quickSort(nums, l, i - 1);
quickSort(nums, i + 1, r);
}
```
隨便取一數當基準,將剩餘數分大、小兩類並重複執行直到結束
---
### Merge sort (合併排序法)
```
void merge(vector<int>& nums, int l, int m, int r){
vector<int> tmp(r - l + 1);
int i = l; // index for left subarray
int j = m + 1; // index for right subarray
int k = 0; // index for temporary array
while(i <= m && j <= r){
if(nums[i] <= nums[j]) tmp[k++] = nums[i++];
else tmp[k++] = nums[j++];
}
while(i <= m) tmp[k++] = nums[i++];
while(j <= r) tmp[k++] = nums[j++];
for(i = 0; i < k; i++) nums[l + i] = tmp[i];
}
// mergeSort(nums, 0, nums.size() - 1);
void mergeSort(vector<int>& nums, int l, int r){
if(l >= r) return;
int m = l + (r - l) / 2; //middle index, same as (l+r)/2
mergeSort(nums, l, m);
mergeSort(nums, m + 1, r);
merge(nums, l, m, r);
}
```
將數量二分至只剩單個數,在兩兩一組合併比較大小,再重新二分到剩單個數,直到結束
---