qsort函数
//int (*cmp)(const void *,const void *);
qsort(*s, sz, sizeof(s[0]), cmp);
其中第一个参数s是一个地址,即参与排序的首地址;
sz是需要排序的数量;
sizeof(s[0])则是每一个元素占用的空间大小;
指向函数的指针,用于确定排序的顺序。
模仿的方法:转变为通用的冒泡排序,需要将其中的sz,sizeof(s[0])转换为无符号的整形
cmp变成int (const void* p1, const void* p2)
cmp设计为int类型 返回值大于0就是p1>p2 等于0就是p1=p2 小于0就是p1<p2
冒泡排序的比较时候 因为不知道类型 所以用(char*)将首元素地址强制类型转换再乘以该类型一个元素所占的大小
一组比较完成后如果符合升序则循环往后继续 如果不符合升序则需要交换两个元素
所以需要设计一个Swap函数 来将两者交换
Swap函数内需要使char类型 目的是方便将两者一个字节一个字节的交换
代码如下:
#include <stdio.h>
int cmp_int(const void* p1, const void* p2)
{
return *(int*)p1 - *(int*)p2;
}
void Swap(char* buf1, char* buf2, int width)//不清楚类型 需要一个字节一个字节的交换
{
int i = 0;
for (i = 0; i < width; i++)
{
char tmp = *buf1;
*buf1 = *buf2;
*buf2 = tmp;
buf1++;
buf2++;
}
}
//希望这个bubble_sort函数可以排序任意类型的数据
//cmp设计为int类型 返回值大于0就是p1>p2 等于0就是p1=p2 小于0就是p1<p2
void bubble_sort(void* base, size_t num, size_t width, int (*cmp)(const void* p1, const void* p2))
{
//确定冒泡排序的趟数
size_t i = 0;
for (i = 0; i < num - 1; i++)
{
size_t j = 0;
for (j = 0; j < num - 1 - i; j++)
{
// 两个相邻的元素比较升序 char类型占一个字节从指针指向的位置往后推j * width个字节就是该类型
if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
{
//交换
Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
}
}
}
}
void Print(int arr[], int sz)
{
int a = 0;
for (a = 0; a < sz; a++)
{
printf("%d", arr[a]);
}
}
void test3()
{
int arr[10] = { 1,5,6,8,9,4,3,2,7,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
Print(arr, sz);
}
int main()
{
test3();
return 0;
}