unicstl/src/algo.c

146 lines
2.9 KiB
C

/**
* @file algo.c
* @author wenjf (Orig5826@163.com)
* @brief
* @version 0.1
* @date 2026-05-14
*
* @copyright Copyright (c) 2026
*
*/
#include "algo.h"
// 1. 冒泡排序
bool bubble_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
if (base == NULL || count <= 1)
{
return false;
}
size_t i = 0, j = 0;
for (i = 0; i < count - 1; i++)
{
for (j = 0; j < count - 1 - i; j++)
{
if(compare_obj(base, j, j + 1, obj_size, cmp) > 0)
{
obj_swap(base, j, j + 1, obj_size);
}
}
}
return true;
}
// 2. 插入排序
bool insert_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
if (base == NULL || count <= 1)
{
return false;
}
size_t i = 0, j = 0;
for (i = 1; i < count; i++)
{
for (j = i; j > 0; j--)
{
if(compare_obj(base, j-1, j, obj_size, cmp) > 0)
{
obj_swap(base, j-1, j, obj_size);
}
else
{
break;
}
}
}
return true;
}
// 3. 快速排序
bool quick_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
return insert_sort(base, count, obj_size, cmp);
// return false;
}
// 4. 堆排序
bool heap_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
return false;
}
// 5. 归并排序
bool merge_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
return false;
}
// 6. 选择排序
bool select_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
return false;
}
// 7. 希尔排序
bool shell_sort(void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
return false;
}
// 8. 基数排序
bool radix_sort(void* base, size_t count, size_t obj_size)
{
return false;
}
// 9. 桶排序
bool bucket_sort(void* base, size_t count, size_t obj_size)
{
return false;
}
// 10. 计数排序
bool counting_sort(void* base, size_t count, size_t obj_size)
{
return false;
}
int linear_search(const void* key, const void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
if (key == NULL)
{
return -1;
}
for (size_t i = 0; i < count; i++)
{
if (cmp((const char *)base + i * obj_size, (const char *)key) == 0)
{
return i;
}
}
return -1;
}
int binary_search(const void* key, const void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
}
int binary_search_right(const void* key, const void* base, size_t count, size_t obj_size, compare_fun_t cmp)
{
}
int brute_find(const void* key, size_t key_count, const void* base, size_t base_count, size_t obj_size, compare_fun_t cmp)
{
}
int kmp_find(const void* key, size_t key_count, const void* base, size_t base_count, size_t obj_size, compare_fun_t cmp)
{
}