Search / Sort

This commit is contained in:
2026-08-30 22:24:45 +08:00
parent 3a4717a9d8
commit 0cb98557da
75 changed files with 7570 additions and 7 deletions
+102
View File
@@ -0,0 +1,102 @@
#include "c_InsertionSortX.h"
#include "c_Test.h"
#include <stdlib.h>
#include <stdio.h>
#include "c_StringView.h"
// ==========================================
// 测试用例伴生比对器
// ==========================================
static int sort_compare_ints(const void* a, const void* b, void* args) {
int arg1 = *(const int*)a;
int arg2 = *(const int*)b;
if (arg1 < arg2) return -1;
if (arg1 > arg2) return 1;
return 0;
}
static int sort_compare_string_views(const void* key, const void* elem, void* args) {
return c_StringView_Cmp((c_StringView_t*)key, (c_StringView_t*)elem);
}
// ==========================================
// 核心测试用例
// ==========================================
TEST_CASE(test_c_InsertionSortX_IntArray) {
// 准备一个乱序的 int 数组
int arr[] = { 42, 12, 88, 5, 23, 12, 64 };
c_size_t num = sizeof(arr) / sizeof(arr[0]);
// 执行泛型插入排序
c_InsertionSortX(arr, num, sizeof(int), sort_compare_ints, 0);
// 1. 验证排序后的数组必须呈绝对递增排列
for (c_size_t i = 0; i < num - 1; i++) {
ASSERT_TRUE(arr[i] <= arr[i + 1]);
}
// 2. 检查特定关键点的值,确保排序精度无误
ASSERT_INT_EQ(5, arr[0]); // 最小值
ASSERT_INT_EQ(12, arr[1]); // 相同元素的稳定性保留
ASSERT_INT_EQ(12, arr[2]);
ASSERT_INT_EQ(88, arr[6]); // 最大值
}
TEST_CASE(test_c_InsertionSortX_StringViewArray) {
// 3. 核心测试:对抽取自长文本、无 \0 结束符的 StringView 数组进行排序(深度边界防护)
const char* raw_pool = "banana,apple,date,cherry";
// 手工切片构建一个乱序的无拷贝视图数组
c_StringView_t sv_arr[4];
sv_arr[0] = c_StringView_FromParts(raw_pool, 6); // "banana"
sv_arr[1] = c_StringView_FromParts(raw_pool + 7, 5); // "apple"
sv_arr[2] = c_StringView_FromParts(raw_pool + 13, 4); // "date"
sv_arr[3] = c_StringView_FromParts(raw_pool + 18, 6); // "cherry"
// 针对复杂结构体数组执行泛型插入排序
c_InsertionSortX(sv_arr, 4, sizeof(c_StringView_t), sort_compare_string_views, 0);
// 4. 验证排序后的字典序状态
// 正确顺序应当为: "apple" (size 5) -> "banana" (size 6) -> "cherry" (size 6) -> "date" (size 4)
ASSERT_INT_EQ(5, (int)sv_arr[0].size);
ASSERT_TRUE(memcmp(sv_arr[0].str, "apple", 5) == 0);
ASSERT_INT_EQ(6, (int)sv_arr[1].size);
ASSERT_TRUE(memcmp(sv_arr[1].str, "banana", 6) == 0);
ASSERT_INT_EQ(6, (int)sv_arr[2].size);
ASSERT_TRUE(memcmp(sv_arr[2].str, "cherry", 6) == 0);
ASSERT_INT_EQ(4, (int)sv_arr[3].size);
ASSERT_TRUE(memcmp(sv_arr[3].str, "date", 4) == 0);
}
TEST_CASE(test_c_InsertionSortX_EdgeCases) {
int single_arr[] = { 99 };
// 1. 空参数及单元素安全防御,确保不发生无符号整数溢出和死循环
c_InsertionSortX(NULL, 1, sizeof(int), sort_compare_ints, 0);
c_InsertionSortX(single_arr, 1, sizeof(int), sort_compare_ints, 0);
c_InsertionSortX(single_arr, 0, sizeof(int), sort_compare_ints, 0);
c_InsertionSortX(single_arr, 1, sizeof(int), NULL, 0);
ASSERT_INT_EQ(99, single_arr[0]);
}
int main(int argc, char** argv){
TEST_START(Unit Tests);
// 运行普通无环境要求的用例
RUN_TEST(test_c_InsertionSortX_IntArray);
RUN_TEST(test_c_InsertionSortX_StringViewArray);
RUN_TEST(test_c_InsertionSortX_EdgeCases);
// 打印最终统计报告
TEST_REPORT();
RETURN_TEST_STATUS;
}