汎用アルゴリズムの作成

2410 ワード

前にいろいろなアルゴリズムを書いたことがありますが、これらのコードを書くときに欠点があります.皆さんは発見しましたか?それは,これらのアルゴリズムで用いられるデータ構造が単純なintデータであることである.したがって、intのソートであれば、問題はありません.肝心なのは、もし他のデータ型だったら、私たちはどうすればいいのでしょうか.
C++では,クラス関数という解決策がある.泡のソートで言えば、私たちは完全にこのように書くことができます.
template 
void bubbleSort(type array[], int length) 
{
    if(NULL == array || 0 == length) {
        return;
    }
    
    for (int i = 0; i < length - 1; i++) {
        for (int j = 0; j < length - i - 1; j++) {
            if (array[j] > array[j+1]) {
                type temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
            }
        }
    }
    
    return;
}

もちろん、classが上記のアルゴリズムを呼び出す必要がある場合は、typeデフォルトコンストラクション関数、typeコピーがコンストラクション関数の2つの関数を定義する必要があります.
では、C言語では何か方法がありますか?実は、それがvoid*という方法もあります.
//     -    (Bubble Sort)
void bubbleSort(void* array[], int length, int (* compare)(void*, void*), void(* swap)(void*, void*)) {
    for (int outer = 0; outer < length - 1; outer++) {
        for (int inner = 0; inner < length - outer - 1; inner++) {
            if(compare(array[inner], array[inner + 1])) {
                swap(array[inner], array[inner + 1]);
            }
        }
    }
    return;
}

具体的なアプリケーションでは、void*を自分の必要なデータポインタに変換するだけです.たとえばintソートであれば、次の2つの関数を追加する必要があります.
int compare(void* var1, void* var2) {
    int* p_var1 = (int*)var1;
    int* p_var2 = (int*)var2;
    
    return (*p_var1 > *p_var2) ? 1 : 0;
}

void swap(void* var1, void* var2) {
    int* p_var1 = (int*)var1;
    int* p_var2 = (int*)var2;
    
    int temp = *p_var1;
    *p_var1 = *p_var2;
    *p_var2 = temp;
}

関数呼び出しは以下のようになり、データ変換がやや面倒になります.
//       
void print(int array[], int length) {
    for (int j = 0; j < length; j++) {
        printf(" %d ", array[j]);
    }
    printf("
"); } int main(int argc, const char * argv[]) { int array[8] = { 49, 38, 65, 97, 76, 13, 27, 49 }; int *p_arrayp[8]; for (int i =0; i < 8; i ++) { p_arrayp[i] = &array[i]; } bubbleSort((void**)p_arrayp, 8, compare, swap); print(array,8); return 0; }

まとめ:
  • 汎用関数を書く前に、特定のタイプのアルゴリズム関数
  • を書く必要があります.
  • 汎用アルゴリズムの鍵は、汎用コンテンツと具体的なデータ型をどのように分離するか
  • である.
  • C++とC言語は共通アルゴリズムにそれぞれ方法があり、多くの使用をお勧めします.特によく使われる関数