Skip to content

Commit 7988e3f

Browse files
committed
✨ feat(search): 增加搜索算法
1 parent 9215cae commit 7988e3f

File tree

5 files changed

+239
-22
lines changed

5 files changed

+239
-22
lines changed

src/algorithm.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,5 @@
55
#include "algorithms/humi_calc.h"
66
#include "algorithms/polyfit.h"
77
#include "algorithms/sort.h"
8+
#include "algorithms/search.h"
89
#endif // ALGORITHM_MODULE_H

src/algorithms/filter.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,3 @@ void findMinGeneric(void *arr, int size, int elementSize, void *minValue, int *m
7373
}
7474
}
7575
}
76-
77-
int countOccurrences(void *arr, int size, int elementSize, void *target)
78-
{
79-
int count = 0;
80-
for (int i = 0; i < size; i++)
81-
{
82-
void *currentElement = (char *)arr + i * elementSize;
83-
if (memcmp(currentElement, target, elementSize) == 0) { count++; }
84-
}
85-
return count;
86-
}

src/algorithms/filter.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,5 @@ void findMaxGeneric(void *arr, int size, int elementSize, void *targetValue, int
4848
// 通用最小值及位置
4949
void findMinGeneric(void *arr, int size, int elementSize, void *targetValue, int *index, CompareFunc compare);
5050

51-
/**
52-
* @brief 计算数组中某个元素出现的次数
53-
*
54-
* @param arr
55-
* @param size
56-
* @param elementSize
57-
* @param target
58-
* @param index
59-
* @return int 返回出现的次数
60-
*/
61-
int countOccurrences(void *arr, int size, int elementSize, void *target);
6251

6352
#endif // FILTER_H

src/algorithms/search.c

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
#include "search.h"
2+
#include <string.h> // 用于 memcpy 和 memcmp
3+
#include <stdlib.h> // 用于 malloc 和 free
4+
#include "sort.h"
5+
// 线性查找实现
6+
void *linear_search(const void *base, size_t num, size_t size, const void *target, CompareFunc compare)
7+
{
8+
const char *array = (const char *)base;
9+
for (size_t i = 0; i < num; i++)
10+
{
11+
if (compare(array + i * size, target) == 0) { return (void *)(array + i * size); }
12+
}
13+
return NULL;
14+
}
15+
16+
// 二分查找实现
17+
void *binary_search(const void *base, size_t num, size_t size, const void *target, CompareFunc compare)
18+
{
19+
const char *array = (const char *)base;
20+
size_t low = 0;
21+
size_t high = num - 1;
22+
23+
while (low <= high)
24+
{
25+
size_t mid = low + (high - low) / 2;
26+
const void *mid_element = array + mid * size;
27+
int cmp_result = compare(mid_element, target);
28+
29+
if (cmp_result == 0) { return (void *)mid_element; }
30+
else if (cmp_result < 0) { low = mid + 1; }
31+
else { high = mid - 1; }
32+
}
33+
return NULL;
34+
}
35+
36+
// 查找最大值
37+
void *find_max(const void *base, size_t num, size_t size, CompareFunc compare)
38+
{
39+
if (num == 0) return NULL; // 空数组
40+
41+
const char *array = (const char *)base;
42+
void *max = (void *)(array); // 初始化为第一个元素
43+
44+
for (size_t i = 1; i < num; i++)
45+
{
46+
if (compare(array + i * size, max) > 0) { max = (void *)(array + i * size); }
47+
}
48+
return max;
49+
}
50+
51+
// 查找最小值
52+
void *find_min(const void *base, size_t num, size_t size, CompareFunc compare)
53+
{
54+
if (num == 0) return NULL; // 空数组
55+
56+
const char *array = (const char *)base;
57+
void *min = (void *)(array); // 初始化为第一个元素
58+
59+
for (size_t i = 1; i < num; i++)
60+
{
61+
if (compare(array + i * size, min) < 0) { min = (void *)(array + i * size); }
62+
}
63+
return min;
64+
}
65+
66+
// 查找某个数据出现的次数
67+
size_t count_occurrences(const void *base, size_t num, size_t size, const void *target, CompareFunc compare)
68+
{
69+
const char *array = (const char *)base;
70+
size_t count = 0;
71+
72+
for (size_t i = 0; i < num; i++)
73+
{
74+
if (compare(array + i * size, target) == 0) { count++; }
75+
}
76+
return count;
77+
}
78+
// 去重实现
79+
size_t remove_duplicates(void *base, size_t num, size_t size, CompareFunc compare)
80+
{
81+
if (num == 0) return 0;
82+
83+
char *array = (char *)base;
84+
size_t unique_index = 0;
85+
86+
for (size_t i = 1; i < num; i++)
87+
{
88+
if (compare(array + i * size, array + unique_index * size) == 0)
89+
{
90+
unique_index++;
91+
memcpy(array + unique_index * size, array + i * size, size);
92+
}
93+
}
94+
95+
return unique_index + 1; // 返回去重后的元素个数
96+
}
97+
98+
// 反转数组实现
99+
void reverse_array(void *base, size_t num, size_t size)
100+
{
101+
char *array = (char *)base;
102+
for (size_t i = 0; i < num / 2; i++)
103+
{
104+
void *temp = malloc(size);
105+
memcpy(temp, array + i * size, size);
106+
memcpy(array + i * size, array + (num - i - 1) * size, size);
107+
memcpy(array + (num - i - 1) * size, temp, size);
108+
free(temp);
109+
}
110+
}
111+
112+
// 查找中位数实现
113+
void *find_median(void *base, size_t num, size_t size, CompareFunc compare)
114+
{
115+
if (num == 0) return NULL;
116+
117+
quickSort(base, num, size, compare); // 先排序
118+
return (char *)base + (num / 2) * size;
119+
}
120+
121+
// 查找众数实现
122+
void *find_mode(void *base, size_t num, size_t size, CompareFunc compare)
123+
{
124+
if (num == 0) return NULL;
125+
126+
quickSort(base, num, size, compare); // 先排序
127+
128+
char *array = (char *)base;
129+
void *mode = array;
130+
size_t max_count = 1;
131+
size_t current_count = 1;
132+
133+
for (size_t i = 1; i < num; i++)
134+
{
135+
if (compare(array + i * size, array + (i - 1) * size) == 0)
136+
{
137+
current_count++;
138+
if (current_count > max_count)
139+
{
140+
max_count = current_count;
141+
mode = array + i * size;
142+
}
143+
}
144+
else { current_count = 1; }
145+
}
146+
147+
return mode;
148+
}
149+
150+
// 数组切片实现
151+
void array_slice(void *dest, const void *src, size_t start, size_t end, size_t size)
152+
{
153+
const char *source = (const char *)src;
154+
char *destination = (char *)dest;
155+
156+
for (size_t i = start; i < end; i++) { memcpy(destination + (i - start) * size, source + i * size, size); }
157+
}
158+
159+
// 数组填充实现
160+
void array_fill(void *base, size_t num, size_t size, const void *value)
161+
{
162+
char *array = (char *)base;
163+
for (size_t i = 0; i < num; i++) { memcpy(array + i * size, value, size); }
164+
}
165+
166+
// 数组拷贝实现
167+
void array_copy(void *dest, const void *src, size_t num, size_t size)
168+
{
169+
memcpy(dest, src, num * size);
170+
}
171+
172+
// 数组求和实现(适用于数值类型)
173+
double array_sum(const void *base, size_t num, size_t size)
174+
{
175+
const char *array = (const char *)base;
176+
double sum = 0.0;
177+
178+
for (size_t i = 0; i < num; i++)
179+
{
180+
if (size == sizeof(int)) { sum += *(int *)(array + i * size); }
181+
else if (size == sizeof(double)) { sum += *(double *)(array + i * size); }
182+
// 可以扩展支持更多类型
183+
}
184+
185+
return sum;
186+
}
187+
188+
// 数组平均值实现(适用于数值类型)
189+
double array_average(const void *base, size_t num, size_t size)
190+
{
191+
if (num == 0) return 0.0;
192+
return array_sum(base, num, size) / num;
193+
}

src/algorithms/search.h

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* @file search.h
3+
* @author mengplus ([email protected])
4+
* @brief 查找算法1
5+
* @version 0.1
6+
* @date 2025-03-23
7+
*
8+
* @copyright Copyright (c) 2025
9+
*
10+
*/
11+
#ifndef SEARCH_LIB_H
12+
#define SEARCH_LIB_H
13+
14+
#include <stddef.h>
15+
16+
// 比较函数指针类型
17+
typedef int (*CompareFunc)(const void*, const void*);
18+
19+
// 线性查找
20+
void* linear_search(const void* base, size_t num, size_t size, const void* target, CompareFunc compare);
21+
22+
// 二分查找(要求数据已排序)
23+
void* binary_search(const void* base, size_t num, size_t size, const void* target, CompareFunc compare);
24+
// 查找最大值
25+
void* find_max(const void* base, size_t num, size_t size, CompareFunc compare);
26+
27+
// 查找最小值
28+
void* find_min(const void* base, size_t num, size_t size, CompareFunc compare);
29+
30+
// 查找某个数据出现的次数
31+
size_t count_occurrences(const void* base, size_t num, size_t size, const void* target, CompareFunc compare);
32+
33+
// 数组操作功能
34+
size_t remove_duplicates(void* base, size_t num, size_t size, CompareFunc compare); // 去重
35+
void reverse_array(void* base, size_t num, size_t size); // 反转数组
36+
void* find_median(void* base, size_t num, size_t size, CompareFunc compare); // 查找中位数
37+
void* find_mode(void* base, size_t num, size_t size, CompareFunc compare); // 查找众数
38+
void array_slice(void* dest, const void* src, size_t start, size_t end, size_t size); // 数组切片
39+
void array_fill(void* base, size_t num, size_t size, const void* value); // 数组填充
40+
void array_copy(void* dest, const void* src, size_t num, size_t size); // 数组拷贝
41+
double array_sum(const void* base, size_t num, size_t size); // 数组求和(适用于数值类型)
42+
double array_average(const void* base, size_t num, size_t size); // 数组平均值(适用于数值类型)
43+
44+
45+
#endif // SEARCH_LIB_H

0 commit comments

Comments
 (0)