Files
cKit/Sort/c_SelectionSort.c
T
2026-08-30 22:24:45 +08:00

36 lines
1.4 KiB
C

#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);
}
}
}