首页 > 其他分享 >C语言-策略模式

C语言-策略模式

时间:2023-06-13 11:36:59浏览次数:35  
标签:arr 策略 int void len C语言 模式 context

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

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

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

// 具体策略函数:冒泡排序
void bubbleSortStrategy(int* arr, int n) {
    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) {
    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) {
    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) {
    quickSort(arr, 0, n - 1);
}

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

// 执行策略
void executeStrategy(Context* context, int* arr, int n) {
    if (context->strategy) {
        context->strategy(arr, n);
    }
}

//打印排序好的数据
void print_after_sort(int *arr, int arr_len)
{
  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;
}

标签:arr,策略,int,void,len,C语言,模式,context
From: https://www.cnblogs.com/Charles-Hui/p/17477036.html

相关文章

  • 【技术积累】软件设计模式中的工厂模式【一】
    什么是工厂模式?工厂模式是一种设计模式,它利用工厂类来创建对象,而不是在程序中直接实例化对象。工厂模式可以隐藏创建对象的具体细节,提高代码可维护性和可扩展性。其核心思想是将对象的创建与具体实现分离开来,通过工厂类统一管理对象的创建,使得客户端无需了解创......
  • C语言,函数包含失败问题
    1.头文件包含顺序出错导致头文件中的函数无法使用eg:在主函数中调用support.h中的strcat()函数失败,但是明明已经包含了strcat()函数的头文件进来;编译器还是提示“Undefinedsysbolsupport(refreedfromxxx.o)”.以下函数只是简单举例,请不要直接拿来编译main中,先调用了includ......
  • 企业数字化转型与运营策略
                                                                                                                           ......
  • 枚举的方法、枚举案例 - 状态机、组织枚举、策略枚举、枚举工具类 - EnumSet 和 EnumM
    引入编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter)概念枚举(enum)全称为enumeration,是JDK1.5中引入的新特性。语法publicenumColor{//默认添加publicstaticfinalRED,GREEN,BLUE;}本质尽管枚举看起来像是一种新的数据类型,实际上,枚举就是一种受限制......
  • linux内存回收策略
    1、64位操作系统进程可以最大申请多大的虚拟内存?64位操作系统的进程可以最大申请的虚拟内存取决于操作系统的架构和其对虚拟内存的管理方式。在理论上,64位操作系统可以支持非常大的虚拟内存空间。在大多数64位操作系统中,每个进程最大可以申请的虚拟内存大小通常为2^64字节,也就是......
  • 探索后疫情时代Airbnb实现逆周期增长的四大策略
    ​01.发挥P2P优势,打造差异化的“旅居生活体验”P2P(Peer-to-Peer)是一种点对点的网络模式,即用户之间可以直接进行交流和交易,无需通过中介或第三方机构。早期Airbnb对P2P的利用仅局限在空置房间的供应上,初期目标客户定位为只追求便宜价格的沙发客,这一客户群体不要求过多的舒适的住......
  • Redis的rehash的策略
    背景:redis字典(hash表)当数据越来越多的时候,就会发生扩容,也就是rehash对比:java中的hashmap,当数据数量达到阈值的时候(0.75),就会发生rehash,hash表长度变为原来的二倍,将原hash表数据全部重新计算hash地址,重新分配位置,达到rehash目的redis中的hash表采用的是渐进式hash的方式:1、red......
  • MVC 模式和三层架构
    1.MVC模式‍MVC模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。‍MVC是一种分层开发的模式,其中:M:Model,业务模型,处理业务V:View,视图,界面展示C:Controller,控制器,处理请求,调用模型和视图​​‍控制器(serlvlet)用来接收浏......
  • 备忘录模式:保存对象状态
    备忘录模式是一种行为型设计模式,用于保存对象的状态,以便在需要时恢复该状态。它通常用于撤销操作或回滚事务。示例代码//被保存状态的对象classOriginator{privateStringstate;publicvoidsetState(Stringstate){this.state=state;}......
  • 职责链模式:推卸责任
    职责链模式是一种行为设计模式,它允许你将请求沿着处理者链进行传递,直到其中一个处理者能够处理该请求为止。//抽象处理者publicabstractclassHandler{protectedHandlersuccessor;publicvoidsetSuccessor(Handlersuccessor){this.successor=suc......