当前位置: 首页 > backend >正文

c语言接口设计模式之抽象算法,以冒泡排序为例

  任意数据类型数组排序(冒泡法)的c接口定义如下:

int bubble_sort(void *array, size_t nmemb, size_t sz, int (*cmp)(const void *, const void *, int), int sort_order)

  (1)传入数组空指针array、数组每个元素的长度nmemb、数组元素个数sz,兼容不同的数据类型;
  (2)不同数据类型的比较函数cmp,以回调函数的形式传入,实现排序算法与具体的数据类型解耦;
  (3)sort_order指定是升序或者降序。当然,该参数也可以不要,但是bubble_sort接口的调用者则需要针对不同的数据类型,写升序和降序的比较函数,个人觉得更麻烦。
  c代码参考魏老师的《C语言最佳实践》,有所改动。完整代码如下:

#include <stdint.h>
#include <string.h>
#include <malloc.h>
#define SWAP_MAX_NMEMB 100
#define ASC 0
#define DESC 1//交换两个变量
int swap(void *a, void *b, size_t nmemb)
{uint8_t tmp[SWAP_MAX_NMEMB];int sta;if (nmemb <= (size_t)SWAP_MAX_NMEMB){memcpy(tmp, a, nmemb);memcpy(a, b, nmemb);memcpy(b, tmp, nmemb);sta = 0;}else{sta = 1;}return sta;
}//数组冒泡排序
int bubble_sort(void *array, size_t nmemb, size_t sz, int (*cmp)(const void *, const void *), int sort_order)
{uint8_t *list = array;int sign, sta = 0;if (sort_order == ASC){sign = 1;}else{sign = -1;}for (size_t i = 0; i < sz - 1; i++){for (size_t j = 0; j < sz - 1 - i; j++){uint8_t *one = list + nmemb * j;uint8_t *next = list + nmemb * (j + 1);if (sign * cmp(one, next) > 0){sta = swap(one, next, nmemb);if (sta == 1) goto EXIT;}}}EXIT:return sta;
}//整形数值比较函数
static int int_cmp(const void *a, const void *b)
{const int *A = (const int *)a;const int *B = (const int *)b;return (*A - *B);
}//字符串比较函数
static int string_cmp(const void *a, const void *b)
{const char **A = (const char **)a;const char **B = (const char **)b;return strcmp(*A, *B);
}int main(void)
{int sta1, sta2;int arr_int[5] = { 3, 5, 1, 2, 4 };char *arr_string[5] = { "c1", "a1", "d1", "b1", "e1" };sta1 = bubble_sort(arr_int, sizeof(int), 5, int_cmp, ASC);sta2 = bubble_sort(arr_string, sizeof(char *), 5, string_cmp, DESC);return 0;
}
http://www.xdnf.cn/news/13783.html

相关文章:

  • @Validation 的使用 Spring
  • Matlab图像清晰度评价指标
  • 如何在网页里填写 PDF下拉框
  • STM32 开发 - 中断案例(中断概述、STM32 的中断、NVIC 嵌套向量中断控制器、外部中断配置寄存器组、EXTI 外部中断控制器、实例实操)
  • Spring Boot 项目中Http 请求如何对响应体进行压缩
  • [C++][设计模式] : 单例模式(饿汉和懒汉)
  • php列表头部增加批量操作按钮,多选订单数据批量微信退款(含微信支付SDK)
  • 洛谷-P3375 【模板】KMP
  • 前端导出PDF(适配ios Safari浏览器)
  • 常见的网络协议有哪些
  • 图像匹配算法 笔记2025
  • 【从零学习JVM|第七篇】快速了解直接内存
  • Qt QTcpSocket的write无法发送数据【已解决】
  • 打卡day52
  • UE5制作与云渲染配置不足?3090/4090显卡云端解放创作力
  • 基于sample_aiisp例子,创建3路编码流,记录
  • 奥威BI:用AI重新定义数据分析,中小企业数字化转型的智能引擎
  • 力扣HOT100之技巧:31. 下一个排列
  • CMS软件以及常见分类
  • excel中自定义公式
  • 基于 Nginx 服务器的泛域名 SSL 证书申请与部署
  • 腾讯云:6月30日起,自动禁用,及时排查
  • keil5怎么关闭工程
  • JavaScript中的迭代器模式:优雅遍历数据的“设计之道”
  • React---Hooks深入
  • vue3 全局过滤器
  • 【Docker 04】image - 镜像
  • 《一本书看透A股》速读笔记
  • Python----神经网络发(神经网络发展历程)
  • 水库大坝安全监测之渗流监测