目录

使用Sort进行通用和自然语言排序

从API版本26.0.0开始,FAST Kit提供Algorithm算法库用于通用数据类型的排序操作,支持任意类型的完整排序、部分排序以及自然语言字符串排序。

Algorithm算法库提供以下能力:

场景介绍

Algorithm算法库适用于以下场景:

基本概念

SortData(排序数据描述符):描述待排序数据的结构,包含元素大小(sizeOf)、数组长度(length)和数据指针(data)三个字段,用于支持任意数据类型的排序。

比较函数(Comparator):需要开发者自行提供的比较回调函数,接收两个元素指针,返回负数表示第一个元素小于第二个,零表示相等,正数表示第一个元素大于第二个。

自然语言排序(Natural Sort):一种智能的字符串排序方式,将字符串中的数字序列视为数值进行比较,而非简单的字符逐个比较,使排序结果更符合人类直觉。

部分排序(Partial Sort):仅保证指定区间内的元素处于完全排序后应有的位置,区间外的元素仅满足与区间内元素的大小关系,不进行完全排序。

约束与限制

[h2]支持的数据类型

[h2]内存要求

[h2]比较函数要求

接口说明

具体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字符串数组进行部分排序,使指定区间对应排序后的相应段。

开发步骤

[h2]通用排序使用步骤

  1. 在CMake脚本中链接相关动态库。

    find_library(
        lib_fast_utils
        NAMES fast_utils
    )
    target_link_libraries(entry PRIVATE ${lib_fast_utils})
  2. 定义比较函数。

  3. 构造HMS_FAST_SortData结构体。

  4. 调用HMS_FAST_Algo_Sort进行排序。

  5. 检查返回值确认排序是否成功。

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

[h2]部分排序使用步骤

  1. 定义比较函数(同通用排序)。

  2. 构造HMS_FAST_SortData结构体。

  3. 指定排序区间参数(offset和count)。

  4. 调用HMS_FAST_Algo_PartialSortAt进行部分排序。

  5. 检查返回值确认操作是否成功。

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

[h2]自然语言排序使用步骤

  1. 构造HMS_FAST_SortData结构体(注意sizeOf必须为sizeof(char*))。

  2. 指定排序方向(ascend:非零为升序,零为降序)。

  3. 调用HMS_FAST_Algo_NaturalSort进行自然语言排序。

  4. 检查返回值确认排序是否成功。

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