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

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

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

代码:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值