/*传统的冒泡排序法*/
#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;
}
}
}传统的冒泡排序法结果:
/*使用快速访问法*/
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;
};使用快速访问法结果:
/*通过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);
}结果:
测试通过结构体数组的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排序结果:
总结:void qsort(void* base, //无类型指针接收传过来的函数地址
int num, //传过来的数组元素个数
int size, //每个元素的大小
int*(*cmp)(const void*, const void*))//函数指针