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

一步步寫算法:通用算法編寫的 C++ 模板與 C 語言 void* 兩大範式

     編輯:關於C語言

痛點:類型耦合的排序代碼

傳統冒泡排序硬編碼 int 類型:

void bubble_sort(int array[], int length) {
    for (int i = length-1; i > 0; i--)
        for (int j = 0; j < i; j++)
            if (array[j] > array[j+1]) {
                int tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
            }
}

若需排序 double、string 或自定義結構體,必須複製修改代碼,違反 DRY 原則。

C++ 範式:模板

利用模板參數化類型,比較與交換操作直接用運算符:

template <typename T>
void bubble_sort(T array[], int length) {
    if (!array || length == 0) return;
    for (int i = length-1; i > 0; i--)
        for (int j = 0; j < i; j++)
            if (array[j] > array[j+1]) {
                T tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
            }
}

要求:類型 T 必須支援 > 比較、拷貝構造、拷貝賦值。

C 語言範式:函數指針 + void*

C 無模板,通過回調函數分離「演算法邏輯」與「類型具體操作」:

// 通用排序框架
void bubble_sort(void *array[], int length,
                 int (*compare)(void*, void*),
                 void (*swap)(void*, void*)) {
    for (int i = length-1; i > 0; i--)
        for (int j = 0; j < i; j++)
            if (compare(array[j], array[j+1]))
                swap(array[j], array[j+1]);
}

// int 類型的具體實現
int compare_int(void *a, void *b) {
    return *(int*)a > *(int*)b;
}

void swap_int(void *a, void *b) {
    int tmp = *(int*)a;
    *(int*)a = *(int*)b;
    *(int*)b = tmp;
}

// 調用示例
void test() {
    int arr[5] = {1, 2, 4, 3, 5};
    int *parr[5] = {&arr[0], &arr[1], &arr[2], &arr[3], &arr[4]};
    bubble_sort((void**)parr, 5, compare_int, swap_int);
}

兩種範式深度對比

維度C++ 模板C void* 回調
類型安全編譯期強類型檢查運行期解釋,易誤用
代碼膨脹每種類型生成獨立代碼單一代碼,體積較小
性能內聯優化,零開銷函數指針間接調用,有開銷
使用便利性直接用數組,語法自然需構建指標數組,轉換繁瑣
泛化能力支援運算符重載、traits完全手動實現比較/交換

現代 C++ 的更佳選擇:std::sort + Lambda

#include <algorithm>
#include <vector>

std::vector<int> v = {5, 2, 4, 1, 3};
std::sort(v.begin(), v.end());                    // 升序
std::sort(v.begin(), v.end(), [](int a, int b){ return a > b; }); // 降序

// 自定義類型
struct Student { string name; int score; };
std::vector<Student> students = ...;
std::sort(students.begin(), students.end(), 
          [](const Student& a, const Student& b) { return a.score > b.score; });

std::sort 平均 O(N log N),內部用 Introsort(快排+堆排+插排混合),遠超冒泡排序的 O(N²)。

總結

  1. 通用算法核心:將「不變的邏輯框架」與「可變的類型操作」解耦
  2. C++ 首選模板:類型安全、性能優、配合 STL 算法庫效率最高
  3. C 語言用 void* 回調:雖繁瑣但通用,嵌入式、跨語言介面常用
  4. 實戰建議:優先用標準庫 std::sort/std::stable_sort,僅在極受限環境或教學中手寫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved