Skip to content

Commit addd8bf

Browse files
committed
📃 docs(readme): 增加说明文档
1 parent 7988e3f commit addd8bf

File tree

6 files changed

+323
-130
lines changed

6 files changed

+323
-130
lines changed

readme.md

Lines changed: 182 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,182 @@
1-
# 算法库
1+
## 算法库
2+
3+
本算法库提供了多种常用的算法实现,涵盖了滤波、拟合、排序、搜索及数组操作等领域。这些算法经过精心设计和优化,旨在为开发者提供高效、可靠的解决方案。
4+
5+
## 目录
6+
7+
1. [滤波算法](#1-滤波算法)
8+
2. [多项式拟合算法](#2-多项式拟合算法)
9+
3. [排序算法](#3-排序算法)
10+
4. [搜索算法](#4-搜索算法)
11+
5. [数组操作](#5-数组操作)
12+
6. [单元测试](#6-单元测试)
13+
7. [使用说明](#使用说明)
14+
8. [贡献指南](#贡献指南)
15+
9. [许可证](#许可证)
16+
17+
## 1. 滤波算法
18+
19+
滤波算法用于对信号或数据进行平滑处理,去除噪声或异常值。
20+
21+
### 1.1 均值滤波
22+
23+
均值滤波通过计算窗口内数据的平均值来平滑数据,适用于去除随机噪声。
24+
25+
### 1.2 中值滤波
26+
27+
中值滤波通过选取窗口内数据的中值来平滑数据,特别适用于去除椒盐噪声。
28+
29+
### 1.3 移动平均滤波
30+
31+
移动平均滤波通过计算窗口内数据的移动平均值来平滑数据,适用于时间序列数据的平滑处理。
32+
33+
## 2. 多项式拟合算法
34+
35+
多项式拟合算法用于拟合数据点,找到一个多项式函数来近似表示数据。
36+
37+
### 2.1 线性拟合
38+
39+
线性拟合通过最小化误差平方和,找到一条最优直线来拟合数据点。
40+
41+
### 2.2 二次拟合
42+
43+
二次拟合通过找到一个二次多项式函数来拟合数据点,适用于具有抛物线趋势的数据。
44+
45+
### 2.3 三次拟合
46+
47+
三次拟合通过找到一个三次多项式函数来拟合数据点,适用于具有更复杂趋势的数据。
48+
49+
## 3. 排序算法
50+
51+
排序算法用于将数据按照某种顺序进行排列。
52+
53+
### 3.1 冒泡排序
54+
55+
冒泡排序通过不断比较相邻元素并交换位置,将数据按升序或降序排列。
56+
57+
### 3.2 选择排序
58+
59+
选择排序通过不断选择最小(或最大)元素并放置在已排序部分的末尾,实现排序。
60+
61+
### 3.3 希尔排序
62+
63+
希尔排序是基于插入排序的改进算法,通过分组排序来提高效率。
64+
65+
### 3.4 归并排序
66+
67+
归并排序采用分治法,将数据分成两半分别排序,然后合并结果。
68+
69+
### 3.5 快速排序
70+
71+
快速排序通过选择一个基准元素,将数据分为两部分并递归排序,实现高效排序。
72+
73+
### 3.6 堆排序
74+
75+
堆排序利用二叉堆的数据结构,通过不断调整堆来实现排序。
76+
77+
### 3.7 计数排序
78+
79+
计数排序通过统计每个元素的出现次数,计算其在排序后数组中的位置。
80+
81+
### 3.8 基数排序
82+
83+
基数排序通过按位排序,从最低位到最高位逐步排序,适用于非负整数的排序。
84+
85+
## 4. 搜索算法
86+
87+
搜索算法用于在数据集中查找特定元素或统计信息。
88+
89+
### 4.1 线性查找
90+
91+
线性查找通过逐个检查元素,直到找到目标元素或遍历完整个数据集。
92+
93+
### 4.2 二分查找
94+
95+
二分查找通过不断缩小搜索范围,适用于已排序数据集的快速查找。
96+
97+
### 4.3 查找最大值
98+
99+
查找最大值算法通过遍历数据集,找到最大的元素。
100+
101+
### 4.4 查找最小值
102+
103+
查找最小值算法通过遍历数据集,找到最小的元素。
104+
105+
### 4.5 查找数据出现次数
106+
107+
查找数据出现次数算法通过统计特定元素在数据集中出现的次数。
108+
109+
## 5. 数组操作
110+
111+
数组操作算法用于对数组进行各种常见的操作和处理。
112+
113+
### 5.1 去除重复
114+
115+
去除重复算法通过过滤数组中的重复元素,返回一个唯一元素的数组。
116+
117+
### 5.2 反转数组
118+
119+
反转数组算法通过交换数组的首尾元素,将数组倒置。
120+
121+
### 5.3 查找中位数
122+
123+
查找中位数算法通过排序数组并找到中间元素,返回数组的中位数。
124+
125+
### 5.4 查找众数
126+
127+
查找众数算法通过统计数组中出现次数最多的元素,返回数组的众数。
128+
129+
### 5.5 数组切片
130+
131+
数组切片算法通过提取数组的指定部分,返回一个新的子数组。
132+
133+
### 5.6 数组填充
134+
135+
数组填充算法通过将数组的指定部分填充为特定值,修改原数组。
136+
137+
### 5.7 数组拷贝
138+
139+
数组拷贝算法通过复制数组的所有元素,返回一个新的数组副本。
140+
141+
### 5.8 数组求和
142+
143+
数组求和算法通过累加数组中的所有元素,返回数组元素的总和。
144+
145+
### 5.9 数组平均值
146+
147+
数组平均值算法通过计算数组元素的总和并除以元素个数,返回数组元素的平均值。
148+
149+
## 6. 单元测试
150+
151+
为确保算法的正确性和可靠性,我们提供了单元测试。所有测试代码位于 `test` 文件夹下。通过以下步骤,您可以运行测试:
152+
153+
1. 进入 `test` 文件夹。
154+
```bash
155+
cd test
156+
```
157+
2. 运行 `make` 命令以编译并执行测试。
158+
```bash
159+
make test
160+
```
161+
162+
`Makefile` 文件包含了编译和运行测试的指令,确保您的开发环境已安装必要的编译工具和依赖库。
163+
164+
## 使用说明
165+
166+
在使用本算法库时,请确保您已正确安装所需的依赖库,并遵循各算法的使用说明。我们建议您在使用前阅读相关文档,以充分理解每个算法的原理和适用场景。
167+
168+
## 贡献指南
169+
170+
如果您希望为算法库贡献代码或提出改进建议,请通过提交Pull Request或Issue的方式与我们联系。我们欢迎任何有助于提升算法库质量和功能的贡献。
171+
172+
## 许可证
173+
174+
本算法库基于MIT许可证开源,您可以自由地使用、修改和分发本库的代码。
175+
176+
---
177+
178+
感谢您使用本算法库,祝您开发顺利!
179+
180+
---
181+
182+
通过以上更新,您的 `README.md` 文件将更加全面,涵盖了单元测试的部分,并提供了明确的测试步骤,方便其他开发者理解和使用您的代码库。

src/algorithm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
#include "algorithms/polyfit.h"
77
#include "algorithms/sort.h"
88
#include "algorithms/search.h"
9+
#include "algorithms/array_utils.h"
910
#endif // ALGORITHM_MODULE_H

src/algorithms/array_utils.c

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#include "array_utils.h"
2+
#include <string.h> // 用于 memcpy 和 memcmp
3+
#include <stdlib.h> // 用于 malloc 和 free
4+
5+
// 去重实现
6+
size_t remove_duplicates(void *base, size_t num, size_t size, CompareFunc compare)
7+
{
8+
if (num == 0) return 0;
9+
10+
char *array = (char *)base;
11+
size_t unique_index = 0;
12+
13+
for (size_t i = 1; i < num; i++)
14+
{
15+
if (compare(array + i * size, array + unique_index * size) != 0)
16+
{
17+
unique_index++;
18+
memcpy(array + unique_index * size, array + i * size, size);
19+
}
20+
}
21+
22+
return unique_index + 1; // 返回去重后的元素个数
23+
}
24+
25+
// 反转数组实现
26+
void reverse_array(void *base, size_t num, size_t size)
27+
{
28+
char *array = (char *)base;
29+
for (size_t i = 0; i < num / 2; i++)
30+
{
31+
void *temp = malloc(size);
32+
memcpy(temp, array + i * size, size);
33+
memcpy(array + i * size, array + (num - i - 1) * size, size);
34+
memcpy(array + (num - i - 1) * size, temp, size);
35+
free(temp);
36+
}
37+
}
38+
39+
// 查找中位数实现
40+
void *find_median(void *base, size_t num, size_t size, CompareFunc compare)
41+
{
42+
if (num == 0) return NULL;
43+
44+
quickSort(base, num, size, compare); // 先排序
45+
return (char *)base + (num / 2) * size;
46+
}
47+
48+
// 查找众数实现
49+
void *find_mode(void *base, size_t num, size_t size, CompareFunc compare)
50+
{
51+
if (num == 0) return NULL;
52+
53+
quickSort(base, num, size, compare); // 先排序
54+
55+
char *array = (char *)base;
56+
void *mode = array;
57+
size_t max_count = 1;
58+
size_t current_count = 1;
59+
60+
for (size_t i = 1; i < num; i++)
61+
{
62+
if (compare(array + i * size, array + (i - 1) * size) == 0)
63+
{
64+
current_count++;
65+
if (current_count > max_count)
66+
{
67+
max_count = current_count;
68+
mode = array + i * size;
69+
}
70+
}
71+
else { current_count = 1; }
72+
}
73+
74+
return mode;
75+
}
76+
77+
// 数组切片实现
78+
void array_slice(void *dest, const void *src, size_t start, size_t end, size_t size)
79+
{
80+
const char *source = (const char *)src;
81+
char *destination = (char *)dest;
82+
83+
for (size_t i = start; i < end; i++) { memcpy(destination + (i - start) * size, source + i * size, size); }
84+
}
85+
86+
// 数组填充实现
87+
void array_fill(void *base, size_t num, size_t size, const void *value)
88+
{
89+
char *array = (char *)base;
90+
for (size_t i = 0; i < num; i++) { memcpy(array + i * size, value, size); }
91+
}
92+
93+
// 数组拷贝实现
94+
void array_copy(void *dest, const void *src, size_t num, size_t size)
95+
{
96+
memcpy(dest, src, num * size);
97+
}
98+
99+
// 数组求和实现(适用于数值类型)
100+
double array_sum(const void *base, size_t num, size_t size)
101+
{
102+
const char *array = (const char *)base;
103+
double sum = 0.0;
104+
105+
for (size_t i = 0; i < num; i++)
106+
{
107+
if (size == sizeof(int)) { sum += *(int *)(array + i * size); }
108+
else if (size == sizeof(double)) { sum += *(double *)(array + i * size); }
109+
// 可以扩展支持更多类型
110+
}
111+
112+
return sum;
113+
}
114+
115+
// 数组平均值实现(适用于数值类型)
116+
double array_average(const void *base, size_t num, size_t size)
117+
{
118+
if (num == 0) return 0.0;
119+
return array_sum(base, num, size) / num;
120+
}

src/algorithms/array_utils.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
#ifndef ARRAY_UTILS_H
2+
#define ARRAY_UTILS_H
3+
4+
#include <stddef.h>
5+
#include "sort.h"
6+
// 比较函数指针类型
7+
typedef int (*CompareFunc)(const void *, const void *);
8+
9+
// 数组操作功能
10+
size_t remove_duplicates(void *base, size_t num, size_t size, CompareFunc compare); // 去重
11+
void reverse_array(void *base, size_t num, size_t size); // 反转数组
12+
void *find_median(void *base, size_t num, size_t size, CompareFunc compare); // 查找中位数
13+
void *find_mode(void *base, size_t num, size_t size, CompareFunc compare); // 查找众数
14+
void array_slice(void *dest, const void *src, size_t start, size_t end, size_t size); // 数组切片
15+
void array_fill(void *base, size_t num, size_t size, const void *value); // 数组填充
16+
void array_copy(void *dest, const void *src, size_t num, size_t size); // 数组拷贝
17+
double array_sum(const void *base, size_t num, size_t size); // 数组求和(适用于数值类型)
18+
double array_average(const void *base, size_t num, size_t size); // 数组平均值(适用于数值类型)
19+
20+
#endif // ARRAY_UTILS_H

0 commit comments

Comments
 (0)