---
title: 訓練場_4
tags: 訓練場
---
[👉 程式自由練習區](https://hackmd.io/@futurenest/code_training_stu_4)
## 氣泡排序法
假設由小到大排序五個數字,50、70、80、40 與 60,從頭到尾不斷比較交換相鄰兩數,直到最大數到最後位置,縮小比較的範圍,再找出縮小範圍的最大數字放置於最後,直到剩下一個元素為止。
> **原始陣列**

> **第一次排序**
排序第 1 個到第 5 個元素,從前往後每次比較交換相鄰兩數,最後前 5 個元素的最大數 80 就在最後面

> **第二次排序**
排序第 1 個到第 4 個元素,從前往後每次比較交換相鄰兩數,最後前 4 個元素的最大數 70 就在最後面

> **第三次排序**
排序第 1 個到第 3 個元素,從前往後每次比較交換相鄰兩數,最後前 3 個元素的最大數 60 就在最後面

> **第四次排序**
排序第 1 個到第 2 個元素,從前往後每次比較交換相鄰兩數,最後前 2 個元素的最大數 50 就在最後面

```python
A = [50, 70, 80, 40, 60]
# 列印出排序前陣列
print("排序前")
for item in A:
print(item,' ', end='')
print()
# 列印出排序過程
for i in range(len(A)-1, 0, -1):
for j in range(i):
if A[j] > A[j+1]:
A[j], A[j+1] = A[j+1], A[j] # 簡化過程
# temp = A[j]
# A[j] = A[j+1]
# A[j+1] = temp
print("氣泡排序外層迴圈執行第", 5-i ,"次")
for item in A:
print(item,' ', end='')
print()
# 列印出排序後陣列
print("排序後")
for item in A:
print(item,' ', end='')
print()
```
```cpp
#include <iostream>
using namespace std;
// 氣泡排序
void bubbleSort(int nums[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (nums[j] > nums[j+1]) {
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}
}
// 選擇排序
void chooseSort(int nums[], int n) {
for(int i = 0; i < n; i++) {
for(int j = i+1; j < n ; j++) {
if(nums[i] > nums[j]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
}
int main() {
int nums[] = { 14, 33, 27, 35, 10 };
// n = 5
int n = sizeof(nums)/sizeof(*nums);
cout << "排序前 = ";
for (int i = 0; i < n; i++) {
cout << nums[i];
if (i != n) cout << ", ";
}
// 換行:"\n"
cout << endl;
// 排序
bubbleSort(nums, n);
cout << "排序後 = ";
for (int i = 0; i < n; i++) {
cout << nums[i];
if (i != n) cout << ", ";
}
cout << endl;
return 0;
}
```
## 插入排序法
假設由小到大排序五個數字,80、50、70、40 與 60,先考慮前兩個元素,將第 2 個元素插入到指定的位置,讓第 1 個到第 2 個元素由小到大排序好,再考慮前三個元素,將第 3 個元素插入到指定的位置,讓第 1 個到第 3 個元素由小到大排序好,依此類推,直到考慮前 n 個元素,將第 n 個元素插入到指定的位置,讓第 1 個到第 n 個元素由小到大排序好。
> **原始陣列**

> **第一次排序**
先考慮前兩個元素,將第 2 個元素插入到指定的位置,讓第 1 個到第 2 個元素由小到大排序好

> **第二次排序**
先考慮前三個元素,將第 3 個元素插入到指定的位置,讓第 1 個到第 3 個元素由小到大排序好

> **第三次排序**
先考慮前四個元素,將第 4 個元素插入到指定的位置,讓第 1 個到第 4 個元素由小到大排序好

> **第四次排序**
先考慮前五個元素,將第 5 個元素插入到指定的位置,讓第 1 個到第 5 個元素由小到大排序好

```python
A = [80, 50, 70, 40, 60]
# 列印出排序前陣列
print("排序前")
for item in A:
print(item,' ', end='')
print()
# 列印出排序過程
for i in range(1, len(A))):
insert = A[i] # 用來存取暫時的資料
j = i - 1
while j >= 0:
if insert < A[j]:
A[j+1] = A[j] # 把所有元素往後推一個
else:
break
j = j-1
A[j+1] = insert # 將最小元素放到第一個
print("外層迴圈執行", i ,"次結果為")
for item in A:
print(item,' ', end='')
print()
# 列印出排序後陣列
print("排序後")
for item in A:
print(item,' ', end='')
print()
```
### 翻轉陣列
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const std::string WHITESPACE = " \n\r\t\f\v";
std::string ltrim(const std::string &s)
{
size_t start = s.find_first_not_of(WHITESPACE);
return (start == std::string::npos) ? "" : s.substr(start);
}
std::string rtrim(const std::string &s)
{
size_t end = s.find_last_not_of(WHITESPACE);
return (end == std::string::npos) ? "" : s.substr(0, end + 1);
}
std::string trim(const std::string &s) {
return rtrim(ltrim(s));
}
int main() {
string text;
string delimiter = ",";
string nums[256];
// cin >> text; //?? /r/n carrige return
getline(cin, text);
int count = 0;
string num;
size_t pos = 0;
// 3, 4 , 5,6 , 7
// npos is end of string
while (
(pos = text.find(delimiter)) != string::npos
) {
num = text.substr(0, pos);
nums[count++] = trim(num);
text.erase(0, pos + delimiter.length());
}
nums[count] = trim(text);
cout << "[";
// Q: i = count, 而不是 count-1
for (int i = count; i >=0; i--) {
cout << nums[i];
if (i != 0) cout << ", ";
}
cout << "]";
}
```