#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;
}
选择排序 C语言实现
最新推荐文章于 2024-09-15 04:17:06 发布