原型:msdn中介绍qsort是用快去排序实现,我们这里使用冒泡排序实现。
qsort(void*base,size_t length,size_t width,int(*cmp)(void *e1, void *e2));
(void *指针像一个垃圾桶什么都可以往里面装。)
base:需要被排序的数组起始地址;
length:需要被排序的数组的长度;
width:需要被排序数组的每一个元素所占字节数;
cmp函数:用户自定义排序类型函数;
实现主体部分:以整形数组为例
qsort部分:
void qsort(void* arr, int sz, int width, int (*cmp)(void* e1, void* e2))
{
int i = 0, j = 0;
for (i = 0; i < sz; i++)
{
for (j = 0; j < sz - i - 1; j++)
{
if (cmp(((char*)arr) + j * width,((char*)arr) + (j + 1) * width)>0)
{
swap(((char*)arr) + j * width ,((char*)arr) + (j + 1) * width,width);
}
}
}
}
重点:为什么要强转为字符指针类型?
1.void指针类型是个垃圾桶什么都能装,+1个步长不知道跳过多少个字节数,所以不行
2.char类型指针每次跳过一个字节数,这时候宽度就派上了用场,+j*width就可以跳过每个元素所占字节数大小,正好可以比较相邻的元素
swap部分:
void swap(char* p1, char* p2, int width)
{
int i = 0;
for (i = 0; i < width; i++)
{
char t = *p1;
*p1 = *p2;
*p2 = t;
p1++; p2++;
}
}
这时候宽度有派上了用场,我们可以把每个数据一个字节一个字节的交换,这样就能实现整体交换了!!!!
自定义cmp示例:
int cmp(void* e1, void* e2)
{
return *((int*)e1) - *((int*)e2);
}
cmp是用户自定义类型,所以强转可以用户来实现了。
主函数部分:
int main()
{
int arr[] = { 1,3,5,7,9,2,4,6,8,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
qsort(arr, sz, sizeof(arr[0]), cmp);
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果:
这样一个排序就写好了,同理这个可以对结构体进行排序,只需要自定义的cmp改成结构体指针就好了