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