C语言设计模式-策略模式

news/2025/10/8 22:25:18/文章来源:https://www.cnblogs.com/cx-mem/p/19130214
#include <stdio.h>
#include <stdlib.h>

typedef signed int int32_t;

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

void print_arr(int arr[], int32_t length)
{
    int32_t i;
    for (i = 0; i < length - 1; i++) {
        printf("%u, ", arr[i]);
    }
    if (length > 0) {
        printf("%u.", arr[i]);
    }
}

void arr_backup(int arr[], int arr_bkp[], int32_t length)
{
    for (int32_t i = 0; i < length; i++) {
        arr_bkp[i] = arr[i];
    }
}

/* C语言实现策略模式
 * 策略是不同排序算法
 */

// 策略接口
typedef struct {
    void (*execute)(int arr[], int32_t length);
} strategy_t;

// 具体策略: 冒泡排序,一轮排序后最右边数最大, 从小到大排序
void bubble_sort(int arr[], int32_t length)
{
    for (int32_t i = 0; i < length; i++) {
        for (int32_t j = 0; j < length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

// 具体策略: 选择排序, 每一次排序找到最小的数放在最左边,从小到大排序
void select_sort(int arr[], int32_t length)
{
    int32_t index;
    for (int32_t i = 0; i < length; i++) {
        index = i;
        for (int32_t j = i + 1; j < length; j++) {
            if (arr[j] < arr[index]) {
                index = j;
            }
        }
        if (index != i) {
            swap(&arr[index], &arr[i]);
        }
    }
}

// 具体策略: 插入排序, 假设第一个数最小,再看第二个数,如果比前面数小的话,从前面的数找到插入位置
void insert_sort(int arr[], int32_t length)
{
    int32_t j;
    int tmp;
    for (int32_t i = 1; i < length; i++) {
        if (arr[i] < arr[i - 1]) {
            tmp = arr[i];
            // 插入到前面有序数组,如果前面的数比tmp大,依次后移
            for (j = i - 1; j >= 0 && arr[j] > tmp; j--) {
                arr[j + 1] = arr[j];
            }
            arr[j + 1] = tmp;
        }
    }
}

// 上下文
typedef struct {
    strategy_t *strategy;
} context_t;

// 设置策略
void set_strategy(context_t *ctx, strategy_t *strategy)
{
    ctx->strategy = strategy;
}

// 执行策略
void exec_strategy(context_t *ctx, int arr[], int32_t length)
{
    ctx->strategy->execute(arr, length);
}

int main()
{
    int arr[] = {2, 6, 4, 3, 3, 6, 1, 2};
    int arr_bkp[8] = {0};
    arr_backup(arr, arr_bkp, 8);
    // 初始化上下文
    context_t context;
    strategy_t b_sort_strategy = {bubble_sort};
    set_strategy(&context, &b_sort_strategy);
    printf("冒泡排序前:\n");
    print_arr(arr, 8);
    exec_strategy(&context, arr, 8);
    printf("\n冒泡排序后:\n");
    print_arr(arr, 8);

    arr_backup(arr_bkp, arr, 8);

    // 设置策略是选择排序
    strategy_t s_sort_strategy = {select_sort};
    set_strategy(&context, &s_sort_strategy);
    printf("\n选择排序前:\n");
    print_arr(arr, 8);
    exec_strategy(&context, arr, 8);
    printf("\n选择排序后:\n");
    print_arr(arr, 8);

    arr_backup(arr_bkp, arr, 8);

    // 设置策略是插入排序
    strategy_t i_sort_strategy = {insert_sort};
    set_strategy(&context, &i_sort_strategy);
    printf("\n插入排序前:\n");
    print_arr(arr, 8);
    exec_strategy(&context, arr, 8);
    printf("\n插入排序后:\n");
    print_arr(arr, 8);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/932006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态张量运算自动优化技术解析

本文介绍了一种名为DietCode的新型自动调度器,能够高效处理动态形状的张量运算,将优化过程加速6倍以上,同时使生成代码性能提升高达70%,显著提升机器学习工作效率。自动优化动态张量运算的执行 深度学习模型核心依…

网站首页关键词设置江苏建设厅网站电话多少

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

多线程插入也是随机io,那为啥不用uuid

多线程插入也是随机io,那为啥不用uuid首先,并发写入确实是随机io,但是uuid带来的页分裂更恶劣 而多线程并发写入有序id,操作系统有办法优化老实说ds说的有点牵强

企业网站制作规划织梦素材网站模板

用 Excel 处理数据时&#xff0c;有时需要对字符串进行拆分。对于比较简单的拆分&#xff0c;使用 Excel 函数可以顺利完成&#xff0c;但碰到一些特殊需求&#xff0c;或者拆分的规则比较复杂时&#xff0c;则很难用 Excel 实现了。这里列出一些拆分需求示例&#xff0c;分析拆…

国庆做题记录(含有一些trick)

这篇文章信息量偏大,请谨慎阅读,注意高效利用右边的目录。 1.1 二分 关联博文:Atserkcn-0/1分数规划 P1404 平均数 既然要让子串平均数最大,那就二分平均数,判断能否达到即可。复杂度 \(O(n\log V)\)。 关联题目:…

【Linux】如何移动材料/文件夹

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【PhysUnits】15.9 引入P1后的右移运算(shr.rs) - 详解

【PhysUnits】15.9 引入P1后的右移运算(shr.rs) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

[论文阅读]PPT: Backdoor Attacks on Pre-trained Models via Poisoned Prompt Tuning - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

10. 模型与视图

一、模型与视图模型/视图架构包含三部分:模型(Model)是应用对象,用来表示数据;视图(View)是模型的用户界面,用来显示数据;委托(Delegate,也被称为 代理)可以定制数据的渲染和编辑方式。通过数据和界面进行…

网站域名备案信息查询wordpress无法查看站点

为啥我会使用pgbackrest进行备份&#xff1f;因为postgresql没有自带的差异备份工具。。。而我们在生产环境上&#xff0c;一般都需要用到差异备份或者增量备份。我们的备份策略基本是&#xff0c;1天1次完整备份&#xff0c;1个小时1次差异备份。如果只需要完整备份&#xff0…

[KaibaMath]1004 关于f(x,y) = [x]+[y] - [x+y]的平移稳定性

[KaibaMath]1004 关于f(x,y) = [x]+[y] - [x+y]的平移稳定性令f(x,y) = [x]+[y] - [x+y], g(x, y) = {x} + {y} - {x+y},则f(x, y) + g(x, y)= 0。 注意f(x, y)和g(x, y)均具有平移稳定性。 例如:f(x+M, y+N) = f(x,…

Mac OS 问题与技巧

docker Desktop中登录ubuntu后出现向上方向键不识别的问题:# 从 sh 切换到 bash /bin/bash通过方向键找到上一个命令: root@a8cf29654a52:/opt/csm# pwd /opt/csm root@a8cf29654a52:/opt/csm# pwd /opt/csm root@a8…

数据分析对网站建设的重要性福田营销型网站建站推广外包

文章目录 前言ts和js的区别&#xff1f;什么是Typescript的方法重载&#xff1f;Typescript中never 和 void 的区别&#xff1f;typescript 中的 is 关键字有什么用&#xff1f;TypeScript支持的访问修饰符有哪些&#xff1f;如何定义一个数组&#xff0c;它的元素可能是字符串…

黑龙江省建设教育网站查询小企业网站建设计划书

目录 1、什么是缓存 2、为什么使用Redis作为MySQL的缓存 3、缓存的更新策略 3.1、策略一&#xff1a;定期生成 3.2、策略二&#xff1a;实时生成 内存淘汰策略【面试重点】 4、缓存预热(Cache preheating)【面试重点】 5、缓存穿透(Cache penetration)【面试重点】 6、…

《算法设计与分析》第一章学习记录

一、互联网大公司的编码规范 核心目标是协同、质量、效率与安全。 1.命名规范 变量、函数、类名必须能清晰地表达其意图,避免使用 a, b, c, tmp 等无意义名称。严格遵守 camelCase、PascalCase、snake_case 等约定,并…

mcp_server

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" https://github.com/runekaagaard/mcp-alchemy"imes": { "command": "uvx", &qu…

香山红叶建设有限公司网站虚拟主机安装wordpress

一、代理模式 代理模式定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。 上面类图中有一个订单接口类(OrderService)、一个订单实现类(OrderServiceImpl)&#xff0c;订单模块的业务相对复杂和重要&#xff0c;如果这时候要在方法执行前后加上日志&#xff0c…

2025.10 国庆集训模拟赛总结

把门视为点,找环,答案就是环的长度先预处理前缀和 然后预处理f[i]表示满足j<i且aj==ai的最大的j。 答案就变成了:第一问用树套树类结构维护 第二问直接二分第一问就行,因为第一问我们在先做了。 树套树太难写,…

详细介绍:https和http有什么区别-http各个版本有什么区别

详细介绍:https和http有什么区别-http各个版本有什么区别pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…

CF2150F Cycle Closing

感觉上判是否能一次完成是困难的。设两次的路径长度分别为 \(a, b\),考虑一些特殊情况。 题目一定有解,考虑取出一棵生成树。可以发现,第二次操作时的边数实际上很多,感觉上对于 \(b\) 不能限制得太小。考虑 \(a\)…