18C语言提高深入浅出day7—03回调函数案例-实现对任意数据类型排序

mac2022-06-30  27

提供一个函数,可以对任意类型的数据进行排序,排序规则 选择排序

阅读本代码之前,先要复习一下选择排序。

代码:

#include <stdio.h> #include <string.h> #include <stdlib.h> void selectSort(void *arr, int eleSize, int len, int (*myCompare)(void *, void *)) { int i, j; char *temp = malloc(eleSize); int MinOrMax; for (i = 0; i < len; i++) { MinOrMax = i;//定义最小值或者最大值下标 for (j = i + 1; j < len; j++) { //j下标的数据地址 char *pJ = (char *)arr + j * eleSize; char *pMinOrMax = (char *)arr + MinOrMax * eleSize; if (myCompare(pJ, pMinOrMax)) { MinOrMax = j;//更新 真实最小值 或者 最大值的下标 } //if(arr[j] < arr[MinOrMax]) } if (i != MinOrMax) { //交换数据 char *pI = (char *)arr + i * eleSize; char *pMinOrMax = (char *)arr + MinOrMax * eleSize; memcpy(temp, pI, eleSize); memcpy(pI, pMinOrMax, eleSize); memcpy(pMinOrMax, temp, eleSize); } } if (temp != NULL) { free(temp); temp = NULL; } } int myCompareInt(void *data1, void *data2) { int *num1 = data1; int *num2 = data2; //if(*num1 < *num2) //{return 1; //} //return 0; return *num1 < *num2; } void test01() { int i; int arr[] = {10, 40, 30, 20, 50}; int len = sizeof(arr) / sizeof(int); selectSort(arr, sizeof(int), len, myCompareInt); for (i = 0; i < len; i++) { printf("%d\n", arr[i]); } } struct Person { char name[64]; int age; }; int myComparePerson(void *data1, void *data2) { struct Person *p1 = data1; struct Person *p2 = data2; //按照年龄 进行从大到小 降序 return p1->age > p2->age; } void test02() { int i; struct Person pArray[] = { {"aaa", 10}, {"bbb", 60}, {"ccc", 20}, {"ddd", 40}, {"eee", 30}, }; int len = sizeof(pArray) / sizeof(struct Person); //按照年龄实现从大到小排序 selectSort(pArray, sizeof(struct Person), len, myComparePerson); for (i = 0; i < len; i++) { printf("name=%s, age=%d\n", pArray[i].name, pArray[i].age); } } int main() { // test01(); test02(); return 0; }
最新回复(0)