1. 结合回调函数和选择排序算法思想对任意类型数组排序
//参数1:数组首地址
//参数2:每个元素的长度(即每个元素所占空间大小)
//参数3:数组的元素个数
void selectSort(void *pAddr, int eleSize, int len, int(*myCompare)(void*, void*))
{
char * temp = malloc(eleSize); //临时内存空间,大小等于数组每个元素所占空间大小
for(int i=0;i<len;i++)
{
int MinOrMax = i; // 定义最小值或最大值的下标为i
for(int j=i+1;j<len;j++)
{
//求出每个元素的地址
char * pJ = (char *)pAddr + j*eleSize;
//求出最小值或最大值的地址
char * pMinOrMax = (char *)pAddr + MinOrMax*eleSize;
//从小到大排序
# 回调函数 myCompare()
if(myCompare(pJ, pMinOrMax)) //满足一定条件,更改下标
{
MinOrMax = j;
}
}
if(MinOrMax != i) //找到了一个更小的值
{
//交换下标MinOrMax 和 i 对应的元素
char * pI = (char *)pAddr + i*eleSize; //计算i下标元素的地址
char * pMinOrMax = (char *)pAddr + MinOrMax*eleSize; //计算真实最小值或者最大值下标的地址
//内存交换
memcpy(temp, pI, eleSize); //使用temp存储pI指针所指向的内存地址及数据
memcpy(pI, pMinOrMax, eleSize); //使用pI指针所指空间存储pMinOrMax指针所指向的内存地址及数据
memcpy(pMinOrMax, temp, eleSize); //使pMinOrMax指针所指空间存储temp指针所指向的内存地址及数据
}
}
//将临时指针释放掉
if(temp != NULL)
{
free(temp);
temp = NULL;
}
}
2. 回调函数:myCompare()
int myCompare(void * data1, void * data2)
{
//从小到大排序
int * num1 = data1;
int * num2 = data2;
return *num1 < *num2;
}
3. 自定义类型数组
struct Person
{
char name[64];
int age;
};
4. 回调函数 myComparePerson
int myComparePerson(void * data1, void * data2)
{
struct Person * p1 = data1;
struct Person * p1 = data1;
//按照年龄 降序
return (p1->age) > (p2->age);
}
void test02()
{
struct Person person[]=
{
{"aaa", 10},
{"bbb", 5},
{"ccc", 15},
{"ddd", 3},
}
int len = sizeof(persons)/sizeof(struct Person);
//将数组中的人员 按照年龄 进行降序 从大到小
selectSort(persons, sizeof(struct Person), len, myComparePerson);
//打印数据
for(int i=0; )
{
printf("姓:%s 年龄:%d\n", person[i].name, person[i].age);
}
}