Search / Sort
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
#include <c_SelectionSort.h>
|
||||
#include "c_Swap.h"
|
||||
|
||||
void c_SelectionSort(void* base, c_size_t num, c_size_t size, c_SortCompare_t cmp, void* args) {
|
||||
// 边界与防御性校验:元素少于 2 个或参数非法时无需排序
|
||||
if (!base || num < 2 || size == 0 || !cmp) {
|
||||
return;
|
||||
}
|
||||
|
||||
char* array_base = (char*)base;
|
||||
|
||||
// 外层循环:安全递增控制,num - 1 经过前置条件 num >= 2 拦截后,绝对不会发生减法下溢
|
||||
c_size_t limit = num - 1;
|
||||
for (c_size_t i = 0; i < limit; i++) {
|
||||
c_size_t min_idx = i;
|
||||
char* min_elem = array_base + (min_idx * size);
|
||||
|
||||
// 内层循环:在剩余未排序区间中寻找绝对最小值
|
||||
for (c_size_t j = i + 1; j < num; j++) {
|
||||
char* current_elem = array_base + (j * size);
|
||||
|
||||
// 执行您带 args 的自定义比对器:如果发现当前元素比已知的 min_elem 还要小
|
||||
if (cmp(current_elem, min_elem, args) < 0) {
|
||||
min_idx = j;
|
||||
min_elem = current_elem; // 更新当前区间的最小值指针与下标
|
||||
}
|
||||
}
|
||||
|
||||
// 优化策略:只有在锁定的最小值不是当前起始位 i 时,才触发物理内存交换
|
||||
// 这将内存写操作(Swap)控制在极致的最多 N-1 次
|
||||
if (min_idx != i) {
|
||||
c_Swap(array_base + (i * size), array_base + (min_idx * size), size);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user