首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++ 排序函數模板實作:支援陣列與 MFC 集合、升降序切換

     編輯:VC 教學

前言

STL std::sort 功能強大但需迭代器支援,MFC 集合類別 (CArray、CStringArray) 未提供迭代器;且降序需額外比較函數。本文實作一個通用氣泡排序模板,支援原生陣列與 MFC 集合,內建升降序切換,適合一般應用場景。

模板設計考量

  • 參數 1:集合物件(需支援 operator[])
  • 參數 2:元素樣本(僅用於型別推導,值不使用)
  • 參數 3:元素個數
  • 參數 4: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;
                }
            }
        }
    }
}

使用範例

1. 原生整數陣列(升序)

int arr[] = {45, 23, 76, 91, 37, 201, 187};
BubbleSort(arr, arr[0], 7); // 預設升序
// 結果:23, 37, 45, 76, 91, 187, 201

2. MFC CArray<int>(升序)

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());
// 結果同上

3. 原生 CString 陣列(降序)

CString strArr[] = {"eagle", "hawk", "falcon"};
BubbleSort(strArr, strArr[0], 3, false); // false = 降序
// 結果:hawk, falcon, eagle

4. MFC CStringArray(降序)

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 元素任意大小
容器需求隨機存取 []雙向迭代器

改進方向

  • 插入排序:小資料量 (<50) 更快
  • Shell 排序:中等資料量折衷
  • 模板特化:針對 CArray 直接呼叫 GetData() 取得指標後用 std::sort
  • C++20 Concepts 限制型別需求:SortableCollection

結語

此模板以最小相依性解決 MFC 集合排序痛點,代碼簡潔易懂,適合教學與中小型專案。大規模或高效能場景請改用 std::sort 搭配適配器,或直接使用 std::vector 替代 MFC 容器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved