cplusplus上对这个库函数的阐释:
作用:实现一个数组内元素的排序
书写形式:
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
参数:
#include
#include
int int_compar(const void*e1,const void* e2)
{
return (*(int*)e1 - *(int*)e2);//强制类型转换,解应用
}
int main()
{
int arr[] = { 2,5,4,6,9,7,8,3,1 };
qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(arr[0]),
int_compar);
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
使用回调函数,用冒泡排序的方式实现,能排任意类型
(冒泡排序详解链接在下,模糊可以去看看)
http://t.csdn.cn/Q0n0q
这是原始冒泡排序的写法
将其改造为qsort函数排法,要改造:
1.改参数
2.改比较方法
3.改互换方法
模仿qsort 函数:
void qsort (void* base, size_t num, size_t size,
int (*compar)(const void*,const void*));
改造后:
void bulle_sort(void* base, size_t sz, size_t width,
int (*cmp)(const void*e1,const void*e2))
重点是这里的参数传什么
也就是用什么计算方式来遍历数组中元素?
一个字节一个字节地访问
来个 char* 类型,括号内参数如下:
(char*)base+j*width,(char*)base+(j+1)*width
强制类型转换为 char指针:
char类型 + 4 表示跳过 4 个字节
然而 int* 类型 + 4 表示跳过 4 个 int所占内存的大小,也就是 16个字节
封装swap()函数实现元素交换,这里举例比较整型数组,和结构体中名字的长短
void swap(char* e1,char* e2,size_t width)
{
int i = 0;
for (i = 0;i < width;i++)
{
char tem = 0;
tem = *(e1 + i);
*(e1+i) = *(e2 + i);
*(e2+i) = tem;
}
}
这里采用的方式是一个字节一个字节地交换:
排序整型数组,结构体:
#include
void swap(char* e1,char* e2,size_t width)
{
int i = 0;
for (i = 0;i < width;i++)
{
char tem = 0;
tem = *(e1 + i);
*(e1+i) = *(e2 + i);
*(e2+i) = tem;
}
}
void bubble_sort(void* base, size_t sz, size_t width,
int (*cmp)(const void*e1,const void*e2))
{
int i = 0;
int j = 0;
for (i = 0;i < sz-1;i++)
{
for (j = 0;j < sz - 1 - i;j++)
{
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
}
}
}
}
//初始化结构体
struct Stu
{
char name[20];
int age;
};
//比较整型
int int_cmp_1(const void* e1, const void* e2)
{
return (*(int*)e1 - *(int*)e2);
}
//比较年龄
int int_cmp_2(const void* e1, const void* e2)
{
return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//比较名字长短
int char_cmp_3(const void* e1, const void* e2)
{
return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//打印整型数组
void Printf_int(int* arr, int sz)
{
int i = 0;
for (i = 0;i < sz;i++)
printf("%d ", arr[i]);
printf("\n");
}
//打印结构体名字
void Printf_char_name(struct Stu* arr, int sz)
{
int i = 0;
for (i = 0;i < sz;i++)
{
printf("%s ", arr[i].name);
}
printf("\n");
}
//打印年龄
void Printf_int_age(struct Stu* arr, int sz)
{
int i = 0;
for (i = 0;i < sz;i++)
{
printf("%d ", arr[i].age);
}
printf("\n");
}
//测试整型数组
void test_int_arr(int* arr1, int sz1)
{
bubble_sort(arr1, sz1, sizeof(arr1[0]), int_cmp_1);
Printf_int(arr1, sz1);
}
//测试年龄
void test_stu_age(struct Stu* arr2, int sz2)
{
bubble_sort(arr2, sz2, sizeof(arr2[0]), int_cmp_2);
Printf_int_age(arr2, sz2);
}
//测试名字
void test_stu_name(struct Stu* arr2,int sz2)
{
bubble_sort(arr2, sz2, sizeof(arr2[0]), char_cmp_3);
Printf_char_name(arr2, sz2);
}
int main()
{
int arr1[10] = { 2,5,4,6,9,7,8,3,1,0 };
struct Stu arr2[] = { {"zhangsan",20},{"lisi",15},{"wangwu",30} };
int sz1 = sizeof(arr1) / sizeof(arr1[0]);
int sz2 = sizeof(arr2) / sizeof(arr2[0]);
test_int_arr(arr1, sz1);
test_stu_age(arr2, sz2);
test_stu_name(arr2, sz2);
return 0;
}