选择排序 C语言实现

#include <cstdio>
#include <cstdlib>
#include <string.h>


// 定义比较结果的枚举类型
typedef enum
{
    LESS  = -1,   // 表示第一个元素小于第二个元素
    EQUAL = 0,    // 表示两个元素相等
    GREATER       // 表示第一个元素大于第二个元素
} Compare_Value_t;

// 定义排序顺序的枚举类型
typedef enum
{
    ASCENDING = 0,   // 表示升序排序
    DESCENDING       // 表示降序排序
} Sort_Order_t;      // 获取数组中第 num 个元素的指针

void* GetPoint(void* FirstPoint, size_t Elem_size, size_t num)
{
    return (char*)FirstPoint + Elem_size * num;
}

void Info_Array_Integer(void* array, size_t num)
{
    printf("---------------------------\n");
    for (int i = 0; i < num; i++)
    {
        printf("%d ", *(int*)((char*)array + sizeof(int) * i));
    }
    printf("\n");
    printf("---------------------------\n");
}

Compare_Value_t Compare_Integer(void* e1, void* e2)
{
    return *(int*)e1 == *(int*)e2 ? EQUAL : *(int*)e1 > *(int*)e2 ? GREATER
                                                                  : LESS;
}




void SelectSort(void* SortArray, size_t Elem_Size, size_t num, Compare_Value_t Compare(void* e1, void* e2), Sort_Order_t order)
{
    int   max, min, begin = 0, end = num - 1;
    void* maxValue = malloc(Elem_Size);   // 分配内存用于存储最大值
    void* minValue = malloc(Elem_Size);   // 分配内存用于存储最小值
    while (begin <= end)
    {
        max = min = begin;
        for (int i = begin + 1; i <= end; i++)
        {
            // 找到当前范围内的最小值索引
            if (Compare(GetPoint(SortArray, Elem_Size, min), GetPoint(SortArray, Elem_Size, i)) == GREATER)
                min = i;
            // 找到当前范围内的最大值索引
            if (Compare(GetPoint(SortArray, Elem_Size, max), GetPoint(SortArray, Elem_Size, i)) == LESS)
                max = i;
        }
        if (order == DESCENDING)
        {
            // 如果排序顺序为降序
            if (max != begin)
            {
                // 交换最大值到当前范围的起始位置
                memcpy(maxValue, GetPoint(SortArray, Elem_Size, max), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, max), GetPoint(SortArray, Elem_Size, begin), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, begin), maxValue, Elem_Size);
            }
            if (min == begin)
                min = max;   // 如果最小值被交换了位置,更新最小值索引
            if (min != end)
            {
                // 交换最小值到当前范围的结束位置
                memcpy(minValue, GetPoint(SortArray, Elem_Size, min), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, min), GetPoint(SortArray, Elem_Size, end), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, end), minValue, Elem_Size);
            }
        }
        else
        {
            // 如果排序顺序为升序
            if (min != begin)
            {
                // 交换最小值到当前范围的起始位置
                memcpy(minValue, GetPoint(SortArray, Elem_Size, min), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, min), GetPoint(SortArray, Elem_Size, begin), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, begin), minValue, Elem_Size);
            }
            if (max == begin)
                max = min;   // 如果最大值被交换了位置,更新最大值索引
            if (max != end)
            {
                // 交换最大值到当前范围的结束位置
                memcpy(maxValue, GetPoint(SortArray, Elem_Size, max), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, max), GetPoint(SortArray, Elem_Size, end), Elem_Size);
                memcpy(GetPoint(SortArray, Elem_Size, end), maxValue, Elem_Size);
            }
        }
        begin++;
        end--;
    }
    free(maxValue);   // 释放分配的内存
    free(minValue);   // 释放分配的内存
}


int arr[15] = {23, 45, 12, 67, 34, 89, 10, 56, 78, 90, 33, 21, 44, 55, 66};
int arr1[5] = {1, 2, 3, 4, 5};
int main(int argc, char* argv[])
{
    Info_Array_Integer((void*)arr, 15);
    SelectSort((void*)arr, sizeof(int), 15, Compare_Integer, DESCENDING);
    Info_Array_Integer((void*)arr, 15);
    SelectSort((void*)arr, sizeof(int), 15, Compare_Integer, ASCENDING);
    Info_Array_Integer((void*)arr, 15);
    SelectSort((void*)arr1, sizeof(int), 5, Compare_Integer, DESCENDING);
    Info_Array_Integer((void*)arr1, 5);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值