从API版本26.0.0开始,FAST Kit提供Algorithm算法库用于通用数据类型的排序操作,支持任意类型的完整排序、部分排序以及自然语言字符串排序。
Algorithm算法库提供以下能力:
通用排序(HMS_FAST_Algo_Sort):对任意数据类型的数组进行完整排序,通过用户提供的比较函数实现灵活的排序逻辑。
部分排序(HMS_FAST_Algo_PartialSortAt):对数组进行原地部分排序,使指定区间[offset, offset + count)包含排序后对应位置的元素,适用于Top-K选择等场景。
自然语言排序(HMS_FAST_Algo_NaturalSort):对UTF-8编码的C字符串数组进行自然语言排序,正确处理数字序列(如file1, file2, file10而非file1, file10, file2)。
自然语言部分排序(HMS_FAST_Algo_NaturalPartialSortAt):结合自然语言排序与部分排序能力,高效获取排序后字符串数组的指定区间。
Algorithm算法库适用于以下场景:
通用排序:
部分排序:
自然语言排序:
SortData(排序数据描述符):描述待排序数据的结构,包含元素大小(sizeOf)、数组长度(length)和数据指针(data)三个字段,用于支持任意数据类型的排序。
比较函数(Comparator):需要开发者自行提供的比较回调函数,接收两个元素指针,返回负数表示第一个元素小于第二个,零表示相等,正数表示第一个元素大于第二个。
自然语言排序(Natural Sort):一种智能的字符串排序方式,将字符串中的数字序列视为数值进行比较,而非简单的字符逐个比较,使排序结果更符合人类直觉。
部分排序(Partial Sort):仅保证指定区间内的元素处于完全排序后应有的位置,区间外的元素仅满足与区间内元素的大小关系,不进行完全排序。
具体API使用说明详见接口文档。
| 名称 | 描述 |
|---|---|
| FAST_ErrorCode HMS_FAST_Algo_Sort (HMS_FAST_SortData *data, HMS_FAST_Sort_CompFunc comp) | 使用用户提供的比较函数对任意类型数组进行完整排序。 |
| FAST_ErrorCode HMS_FAST_Algo_PartialSortAt (HMS_FAST_SortData *data, size_t offset, size_t count, HMS_FAST_Sort_CompFunc comp) | 对数组进行原地部分排序,使指定区间对应排序后的相应段。 |
| FAST_ErrorCode HMS_FAST_Algo_NaturalSort (HMS_FAST_SortData *data, int32_t ascend) | 使用自然语言规则对UTF-8字符串数组进行排序。 |
| FAST_ErrorCode HMS_FAST_Algo_NaturalPartialSortAt (HMS_FAST_SortData *data, size_t offset, size_t count, int32_t ascend) | 使用自然语言规则对UTF-8字符串数组进行部分排序,使指定区间对应排序后的相应段。 |
在CMake脚本中链接相关动态库。
find_library(
lib_fast_utils
NAMES fast_utils
)
target_link_libraries(entry PRIVATE ${lib_fast_utils}) 定义比较函数。
构造HMS_FAST_SortData结构体。
调用HMS_FAST_Algo_Sort进行排序。
检查返回值确认排序是否成功。
#include "FASTKit/fast_utils_algorithm.h"
#include <cstdio>
#include <cstdlib>
// 定义整数比较函数
static int compareInt(HMS_FAST_SortElementConstPtr first, HMS_FAST_SortElementConstPtr second) {
int a = *static_cast<const int*>(first);
int b = *static_cast<const int*>(second);
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
int main() {
int arr[] = {5, 2, 8, 1, 9, 3, 7, 4, 6, 0};
size_t length = sizeof(arr) / sizeof(arr[0]);
HMS_FAST_SortData data = {sizeof(int), length, arr};
FAST_ErrorCode ret = HMS_FAST_Algo_Sort(&data, compareInt);
if (ret != FAST_ERROR_CODE_SUCCESS) {
printf("Sorting failed with error code: %d\n", ret);
return -1;
}
// 排序后:0, 1, 2, 3, 4, 5, 6, 7, 8, 9
for (size_t i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
} 定义比较函数(同通用排序)。
构造HMS_FAST_SortData结构体。
指定排序区间参数(offset和count)。
调用HMS_FAST_Algo_PartialSortAt进行部分排序。
检查返回值确认操作是否成功。
#include "FASTKit/fast_utils_algorithm.h"
#include <cstdio>
static int compareInt(HMS_FAST_SortElementConstPtr first, HMS_FAST_SortElementConstPtr second) {
int a = *static_cast<const int*>(first);
int b = *static_cast<const int*>(second);
if (a < b) return -1;
if (a > b) return 1;
return 0;
}
int main() {
int arr[] = {9, 4, 7, 1, 3, 8, 5, 6, 2, 0};
size_t length = sizeof(arr) / sizeof(arr[0]);
HMS_FAST_SortData data = {sizeof(int), length, arr};
// 获取 arr[2] 开始的 3 个元素
FAST_ErrorCode ret = HMS_FAST_Algo_PartialSortAt(&data, 2, 3, compareInt);
if (ret != FAST_ERROR_CODE_SUCCESS) {
printf("Partial sort failed with error code: %d\n", ret);
return -1;
}
// 窗口内 3 个元素为:2, 3, 4(已排序)
printf("Element 2~4: %d, %d, %d\n", arr[2], arr[3], arr[4]);
return 0;
} 构造HMS_FAST_SortData结构体(注意sizeOf必须为sizeof(char*))。
指定排序方向(ascend:非零为升序,零为降序)。
调用HMS_FAST_Algo_NaturalSort进行自然语言排序。
检查返回值确认排序是否成功。
#include "FASTKit/fast_utils_algorithm.h"
#include <cstdio>
int main() {
const char* arr[] = {"file10.txt", "file2.txt", "file1.txt", "file20.txt", "file3.txt"};
size_t length = sizeof(arr) / sizeof(arr[0]);
HMS_FAST_SortData data = {sizeof(char*), length, const_cast<char**>(arr)};
// 升序排序
FAST_ErrorCode ret = HMS_FAST_Algo_NaturalSort(&data, 1);
if (ret != FAST_ERROR_CODE_SUCCESS) {
printf("Natural sort failed with error code: %d\n", ret);
return -1;
}
// 排序后:file1.txt, file2.txt, file3.txt, file10.txt, file20.txt
for (size_t i = 0; i < length; i++) {
printf("%s\n", arr[i]);
}
return 0;
}