提供一个函数,可以对任意类型的数据进行排序,排序规则 选择排序
阅读本代码之前,先要复习一下选择排序。
代码:
#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;
}