练习使用qsort函数
void qsort( void *base,使用qsort首先需要传要排序的地址,
size_t num, 待排序的数据元素个数
size_t width,每一个元素的大小,是多少字节的
int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
最后一个是要参数是 排升序还是降序的函数,
这个函数的返回类型是int 参数有两个,分别是const void* e1,
和const void* e2 这个函数的功能就是比较传入的两个参数的大小,如果返回大于0
则是降序,如果返回小于0就是升序
//这是我们自己写的判断升序或是降序的函数
int cmp_arr(const void* e1, const void* e2)
{
return (*(int*)e2) - (*(int*)e1);
}
void test1()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp_arr);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
struct stu
{
int age;
char name[20];
};
int cmp_struct(const void* e1, const void* e2)
{
//这里要把void* 强转成 我们要排序的类型,由于qsort没有帮我们做这一步,所以我们要自己强转
return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
}
//排序结构体也是可以的
void test2()
{
struct stu S[] = { {20,"zhangsan"}, {15,"lisi"}, {30,"wangwu"} };
int sz = sizeof(S) / sizeof(S[0]);
qsort(S, sz, sizeof(S[0]), cmp_struct);
}
int main()
{
test1();
test2();
return 0;
}
//模拟实现qsort
void Swap(char* e1, char* e2, int width)
{
//这里根据字节大小来判断循环次数,交换两个指针的每个字节数据
for (int i = 0; i < width; i++)
{
char tmp = *e1;
*e1 = *e2;
*e2 = tmp;
e1++;
e2++;
}
}
int cmp_arr(const void* e1, const void* e2)
{
return (*(int*)e1) - (*(int*)e2);
}
//由于我们要写一个适应多个类型的排序函数,所以我们不清楚具体是那个类型的,这里只能用void*来接收,再根据要排序的个数,和一个数的字节大小,来判断
void bubble_sort(void* base, int sz, int width, int (*cmp)(const void* e1, const void* e2))
{
int flag = 1;//加这个是为了,提前退出循环,假如我们要排序的数组已经是有序的了,直接就在第一轮循环结束时跳出
for (int i = 0; i < sz-1; i++)
{
for (int j = 0; j < sz - 1 - i; j++)
{
//主要是这个位置利用我们自己写的判断函数,判断要升序还是降序
if ((cmp_arr((char*)base + j * width,
(char*)base + (j + 1) * width))>0)
{
//交换的话,我们需要传三个参数,一个是第一个元素的地址,和第二个元素的地址,第三个元素传的是一个元素字节大小
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
flag = 0;
}
}
//加这个是为了,提前退出循环,假如我们要排序的数组已经是有序的了,直接就在第一轮循环结束时跳出
if (flag == 1)
{
break;
}
}
}
int main()
{
int arr[] = {6,4,3,1,4,7,9,1,3,0};
int sz = sizeof(arr) / sizeof(arr[0]);//sizeof这里对应的是单独的数组名,所以这里取的是整个数组的大小
bubble_sort(arr, sz, sizeof(arr[0]), cmp_arr);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}