voidselectionSort(vector<int>& arr){ int n = arr.size(); for (int i = 0; i < n - 1; i++) { int minIdx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } swap(arr[i], arr[minIdx]); } }
voidmerge(vector<int>& arr, int l, int m, int r){ vector<int> L(arr.begin() + l, arr.begin() + m + 1); vector<int> R(arr.begin() + m + 1, arr.begin() + r + 1); int i = 0, j = 0, k = l; while (i < L.size() && j < R.size()) { if (L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while (i < L.size()) arr[k++] = L[i++]; while (j < R.size()) arr[k++] = R[j++]; }
voidmergeSort(vector<int>& arr, int l, int r){ if (l >= r) return; int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); }
intmain(){ vector<int> v = {38, 27, 43, 3, 9, 82, 10}; mergeSort(v, 0, v.size() - 1); for (int x : v) cout << x << " "; }
// 自訂排序 sort(v.begin(), v.end(), [](int a, int b) { return a % 3 < b % 3; // 按模 3 餘數升冪 }); }
// 手刻版本(理解用) intpartition(vector<int>& arr, int low, int high){ int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) swap(arr[++i], arr[j]); } swap(arr[i + 1], arr[high]); return i + 1; }
voidquickSort(vector<int>& arr, int low, int high){ if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } }
// 競程中 priority_queue 就是一個 Max-Heap intmain(){ priority_queue<int> maxHeap; vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6}; for (int x : v) maxHeap.push(x);
vector<int> sorted; while (!maxHeap.empty()) { sorted.push_back(maxHeap.top()); maxHeap.pop(); } reverse(sorted.begin(), sorted.end()); for (int x : sorted) cout << x << " "; }
// 手刻 Heap Sort voidheapify(vector<int>& arr, int n, int i){ int largest = i, l = 2*i+1, r = 2*i+2; if (l < n && arr[l] > arr[largest]) largest = l; if (r < n && arr[r] > arr[largest]) largest = r; if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } }
voidheapSort(vector<int>& arr){ int n = arr.size(); for (int i = n/2-1; i >= 0; i--) heapify(arr, n, i); for (int i = n-1; i > 0; i--) { swap(arr[0], arr[i]); heapify(arr, i, 0); } }
🔵 Counting Sort(計數排序)
核心思想:不靠「比較」來排序!先統計每個數字出現幾次,再依序填回陣列。
限制條件:只適用於整數,且數值範圍 k 不能太大(k = max - min),因為需要建立大小為 k 的計數陣列。
voidcountingSort(vector<int>& arr){ if (arr.empty()) return; int maxVal = *max_element(arr.begin(), arr.end()); int minVal = *min_element(arr.begin(), arr.end()); int range = maxVal - minVal + 1;
vector<int> count(range, 0); for (int x : arr) count[x - minVal]++;
int idx = 0; for (int i = 0; i < range; i++) { while (count[i]-- > 0) arr[idx++] = i + minVal; } }
intmain(){ vector<int> v = {4, 2, 2, 8, 3, 3, 1}; countingSort(v); for (int x : v) cout << x << " "; // Output: 1 2 2 3 3 4 8 }
voidselectionSort(vector<int>& arr){ int n = arr.size(); for (int i = 0; i < n - 1; i++) { int minIdx = i; for (int j = i + 1; j < n; j++) { if (arr[j] < arr[minIdx]) minIdx = j; } swap(arr[i], arr[minIdx]); } }
voidmerge(vector<int>& arr, int l, int m, int r){ vector<int> L(arr.begin() + l, arr.begin() + m + 1); vector<int> R(arr.begin() + m + 1, arr.begin() + r + 1); int i = 0, j = 0, k = l; while (i < L.size() && j < R.size()) { if (L[i] <= R[j]) arr[k++] = L[i++]; else arr[k++] = R[j++]; } while (i < L.size()) arr[k++] = L[i++]; while (j < R.size()) arr[k++] = R[j++]; }
voidmergeSort(vector<int>& arr, int l, int r){ if (l >= r) return; int m = l + (r - l) / 2; mergeSort(arr, l, m); mergeSort(arr, m + 1, r); merge(arr, l, m, r); }
intmain(){ vector<int> v = {38, 27, 43, 3, 9, 82, 10}; mergeSort(v, 0, v.size() - 1); for (int x : v) cout << x << " "; }
// 競程直接用 std::sort,底層已是 IntroSort (Quick+Heap+Insertion) intmain(){ vector<int> v = {10, 7, 8, 9, 1, 5}; sort(v.begin(), v.end()); // 升冪 sort(v.begin(), v.end(), greater<int>()); // 降冪 // 自訂排序 sort(v.begin(), v.end(), [](int a, int b) { return a % 3 < b % 3; // 按模 3 餘數升冪 }); }
// 手刻版本(理解用) intpartition(vector<int>& arr, int low, int high){ int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] < pivot) swap(arr[++i], arr[j]); } swap(arr[i + 1], arr[high]); return i + 1; }
voidquickSort(vector<int>& arr, int low, int high){ if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } }
// 競程中 priority_queue 就是一個 Max-Heap intmain(){ priority_queue<int> maxHeap; vector<int> v = {3, 1, 4, 1, 5, 9, 2, 6}; for (int x : v) maxHeap.push(x);
vector<int> sorted; while (!maxHeap.empty()) { sorted.push_back(maxHeap.top()); maxHeap.pop(); } // sorted 是降冪,反轉後得升冪 reverse(sorted.begin(), sorted.end()); for (int x : sorted) cout << x << " "; }
// 手刻 Heap Sort voidheapify(vector<int>& arr, int n, int i){ int largest = i, l = 2*i+1, r = 2*i+2; if (l < n && arr[l] > arr[largest]) largest = l; if (r < n && arr[r] > arr[largest]) largest = r; if (largest != i) { swap(arr[i], arr[largest]); heapify(arr, n, largest); } }
voidheapSort(vector<int>& arr){ int n = arr.size(); for (int i = n/2-1; i >= 0; i--) heapify(arr, n, i); for (int i = n-1; i > 0; i--) { swap(arr[0], arr[i]); heapify(arr, i, 0); } }
🔵 Counting Sort(計數排序)
核心思想:不靠「比較」來排序!先統計每個數字出現幾次,再依序填回陣列。
限制條件:只適用於整數,且數值範圍 k 不能太大(k = max - min),因為需要建立大小為 k 的計數陣列。
voidcountingSort(vector<int>& arr){ if (arr.empty()) return; int maxVal = *max_element(arr.begin(), arr.end()); int minVal = *min_element(arr.begin(), arr.end()); int range = maxVal - minVal + 1; vector<int> count(range, 0); for (int x : arr) count[x - minVal]++; int idx = 0; for (int i = 0; i < range; i++) { while (count[i]-- > 0) arr[idx++] = i + minVal; } }
intmain(){ vector<int> v = {4, 2, 2, 8, 3, 3, 1}; countingSort(v); for (int x : v) cout << x << " "; // Output: 1 2 2 3 3 4 8 }