C语言-策略模式

1.假设我们需要实现一个排序程序,可以对一个整型数组进行排序。我们需要使用策略模式来封装不同的排序算法,例如冒泡排序、插入排序和快速排序。
2.Code

点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>

// 策略接口
typedef void (*Strategy)(int*, int);

// 具体策略函数:冒泡排序
void bubbleSortStrategy(int* arr, int n) {
    assert(arr);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 具体策略函数:插入排序
void insertionSortStrategy(int* arr, int n) {
    assert(arr);

    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

// 具体策略函数:快速排序
void quickSort(int* arr, int left, int right) {
    assert(arr);

    if (left >= right) return;
    int pivot = arr[left];
    int i = left + 1, j = right;
    while (i <= j) {
        while (i <= j && arr[i] < pivot) i++;
        while (i <= j && arr[j] > pivot) j--;
        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    int temp = arr[left];
    arr[left] = arr[j];
    arr[j] = temp;
    quickSort(arr, left, j - 1);
    quickSort(arr, j + 1, right);
}

void quickSortStrategy(int* arr, int n) {
    assert(arr);
    quickSort(arr, 0, n - 1);
}

// 上下文类
typedef struct {
    Strategy strategy;
} Context;

// 执行策略
void executeStrategy(Context* context, int* arr, int n) {
    assert(arr);
    assert(context);

    if (context->strategy) {
        context->strategy(arr, n);
    }
}

//打印排序好的数据
void print_after_sort(int *arr, int arr_len)
{
    assert(arr);

    for (int i = 0; i < arr_len; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    // 创建具体策略函数
    Strategy bubbleSort = bubbleSortStrategy;
    Strategy insertionSort = insertionSortStrategy;
    Strategy quickSort = quickSortStrategy;

    int arr_1[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int arr_2[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int arr_3[] = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
    int arr_len = sizeof(arr_1) / sizeof(arr_1[0]);

    // 创建上下文对象,并使用具体策略函数:冒泡排序
    Context context = {bubbleSort};
    executeStrategy(&context, arr_1, arr_len);
    print_after_sort(arr_1, arr_len);
    

    // 切换策略为具体策略函数:插入排序
    context.strategy = insertionSort;
    executeStrategy(&context, arr_2, arr_len);
    print_after_sort(arr_2, arr_len);

    // 切换策略为具体策略函数:快速排序
    context.strategy = quickSort;
    executeStrategy(&context, arr_3, arr_len);
    print_after_sort(arr_3, arr_len);

    return 0;
}

posted @   Charles_hui  阅读(117)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示