學完這些基本的資料結構之後,我想來介紹一些演算法
因為之前看過一句話
Algorithms + Data Structures = Programs
by Niklaus Wirth
一個好的程式需要演算法+資料結構,還記得在 Day 1 有說過怎麼讓程式不只會跑,還能跑得又快又好嗎,所以這幾天應該都會來介紹演算法
事不遲疑,趕快來介紹吧~
排序(Sort) 就是將資料由小到大或由大到小排列。
排序的分類方式有很多種,我這邊先講比較常見的三種
依資料量多寡(記憶體使用量) :
依比較方式來排序 :
依穩定性 :
| 排序演算法 | 平均時間複雜度 | 最壞時間複雜度 | 最好時間複雜度 |
|---|---|---|---|
| 氣泡排序 (Bubble Sort) | O(n²) | O(n²) | O(n) |
| 選擇排序 (Selection Sort) | O(n²) | O(n²) | O(n²) |
| 插入排序 (Insertion Sort) | O(n²) | O(n²) | O(n) |
| 快速排序 (Quick Sort) | O(n log n) | O(n²) | O(n log n) |
| 合併排序 (Merge Sort) | O(n log n) | O(n log n) | O(n log n) |
| 堆積排序 (Heap Sort) | O(n log n) | O(n log n) | O(n log n) |
n:排序資料筆數
接下來我會先介紹氣泡排序、選擇排序、和插入排序
比較相鄰的兩個元素,如果前面的資料比後面的大就交換
例如 : [9,2,14,0]
第一輪,[2 9] 交換,[9 14]交換,[14 0]交換
可以發現最大值14跑到最後面
回到頭繼續比較

程式碼
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swap(arr[j], arr[j + 1]);
}
}
}
}
每輪都從還沒排序好的部分裡找出最小值,把它換到最前面。
第二輪 : 2 已經是最小值了


程式碼
void selectionSort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j; // 找到更小的,更新索引
}
}
swap(arr[i], arr[minIndex]); // 一輪只交換一次
}
}
明天我們會繼續看其他的排序方法 !
參考資料和書籍