STL std::sort 功能強大但需迭代器支援,MFC 集合類別 (CArray、CStringArray) 未提供迭代器;且降序需額外比較函數。本文實作一個通用氣泡排序模板,支援原生陣列與 MFC 集合,內建升降序切換,適合一般應用場景。
operator[])bool ascend = true 升序/降序>/<)template <typename COLLECTION_TYPE, typename ELEMENT_TYPE>
void BubbleSort(COLLECTION_TYPE& collection, ELEMENT_TYPE element, int count, bool ascend = true) {
for (int i = 0; i < count - 1; ++i) {
for (int j = 0; j < count - 1 - i; ++j) {
if (ascend) {
// 升序:前者大於後者則交換
if (collection[j] > collection[j + 1]) {
ELEMENT_TYPE temp = collection[j];
collection[j] = collection[j + 1];
collection[j + 1] = temp;
}
} else {
// 降序:前者小於後者則交換
if (collection[j] < collection[j + 1]) {
ELEMENT_TYPE temp = collection[j];
collection[j] = collection[j + 1];
collection[j + 1] = temp;
}
}
}
}
}
int arr[] = {45, 23, 76, 91, 37, 201, 187};
BubbleSort(arr, arr[0], 7); // 預設升序
// 結果:23, 37, 45, 76, 91, 187, 201
CArray<int, int> coll;
coll.Add(45); coll.Add(23); coll.Add(76);
coll.Add(91); coll.Add(37); coll.Add(201); coll.Add(187);
BubbleSort(coll, coll[0], coll.GetSize());
// 結果同上
CString strArr[] = {"eagle", "hawk", "falcon"};
BubbleSort(strArr, strArr[0], 3, false); // false = 降序
// 結果:hawk, falcon, eagle
CStringArray strColl;
strColl.Add("eagle"); strColl.Add("hawk"); strColl.Add("falcon");
BubbleSort(strColl, strColl[0], strColl.GetSize(), false);
// 結果同上
| 指標 | 氣泡排序 | std::sort (快速排序) |
|---|---|---|
| 時間複雜度 | O(n²) | O(n log n) |
| 空間複雜度 | O(1) | O(log n) 遞迴堆疊 |
| 穩定性 | 穩定 | 不穩定 |
| 適用資料量 | < 5000 元素 | 任意大小 |
| 容器需求 | 隨機存取 [] | 雙向迭代器 |
CArray 直接呼叫 GetData() 取得指標後用 std::sortSortableCollection此模板以最小相依性解決 MFC 集合排序痛點,代碼簡潔易懂,適合教學與中小型專案。大規模或高效能場景請改用 std::sort 搭配適配器,或直接使用 std::vector 替代 MFC 容器。