/*传统的冒泡排序法*/

#include

void print(int arr[], int sz)

{

int i = 0;

for (i = 0; i < sz; i++)

{

printf("%d ", arr[i]);

}

printf("/n");

}


void bubble_sort(int arr[], int sz)

{

//冒泡排序的次数

for (int i = 0; i < sz - 1; i++)

{

//每一次冒泡排序交换的元素对数

for (int j = 0; j < sz - 1 - i; j++)

{

int temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}传统的冒泡排序法结果:

函数指针数组的运用_#include

/*使用快速访问法*/

int cmp(const void* e1, const void* e2)//创建一个函数,且函数的参数类型与上面的

                                         //  接收的函数指针一致

{

return *(int*)e1 - *(int*)e2;//传过来的数组元素类型不确定,无法相加,所以强制转换为Int型

}

void test1()

{

int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };

int sz = sizeof(arr) / sizeof(arr[0]);

print(arr, sz);

qsort(arr, sz, sizeof(arr[0]), cmp);//按照qsort要求传过去相应的参数

print(arr, sz);

}

struct stu{

char name[20];

int age;

};使用快速访问法结果:

函数指针数组的运用_冒泡排序法_02

/*通过age排序*/

int sort_by_age(const void* e1, const void* e2)

{

return ((struct stu*)e1)->age - ((struct stu*)e2)->age;

}

void test2()

{

 struct stu s[3] = { { "zhangsan", 30 }, { "lisi", 20 }, { "wangwu", 40 } };

 int sz = sizeof(s) / sizeof(s[0]);

// qsort(s, sz, sizeof(s[0]), sort_by_age);

 qsort(s, sz, sizeof(s[0]), sort_by_age);

}结果:函数指针数组的运用_i++_03


测试通过结构体数组的name排序

#include

int sort_by_name(const void* e1, const void* e2)

{

return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);

}

void test3()

{

struct stu s[3] = { { "zhangsan", 30 }, { "lisi", 20 }, { "wangwu", 40 } };

int sz = sizeof(s) / sizeof(s[0]);

qsort(s, sz, sizeof(s[0]), sort_by_name);

int main()

{

//test1();//测试整形数组的排序

//test2();//测试通过结构体数组的age排序

test3();//测试通过结构体数组的name排序

}

}测试通过结构体数组的name排序结果:

函数指针数组的运用_函数指针_04





总结:void qsort(void* base,   //无类型指针接收传过来的函数地址

         int num,     //传过来的数组元素个数

         int size,    //每个元素的大小

         int*(*cmp)(const void*, const void*))//函数指针