我们知道,qsort函数共有四个参数,分别是
1.要排序的数组
2.数组的大小
3.数组内每个元素的大小
4.排序方式函数
综上可写出主函数,如下图所示:
int main()
{
int arr[10] = { 3,4,5,6,7,8,9,1,2,0 };
int i = 0;
for (i = 0; i < sz; i++) //排序前,打印数组arr
{
printf("%d ", arr[i]);
}
printf("\n");
int sz = sizeof(arr) / sizeof(arr[0]);
my_qsort(arr,sz,sizeof(arr[0]),cmp_int);
for (i = 0; i < sz; i++) //排序完成后再次打印数组arr
{
printf("%d ", arr[i]);
}
return 0;
}
由于我们目前传入的数组arr为int类型的数组,故易写出排序函数如下(仅考虑从小到大排序)
int cmp_int(void* e1, void* e2)
{
return *(int*)e1 - *(int*)e2;
}
//由于无法得知传入的参数是什么类型,故参数设置为void*
//将e1和e2强制转换为(int*)类型的指针,再解引用,从而得到实际的数字,并相减
//返回的值>0时,进行冒泡排序
my_qsort函数如下所示:
void Swap(char* num1, char* num2,int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
char t = *num1;
*num1 = *num2;
*num2 = t;
num1++;
num2++;
}
}
void my_qsort(void* base, int sz, int width, int(*cmp)(void* ,void* ))
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
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);
}
}
}
}
同样,由于无法确定数组元素的类型,故用void* base来接收数组
我们通过函数指针 cmp 来接收并调用排序函数
将base强制转换为(char*)类型,由于是char*类型,这时base+1表示移动一个字节,
base+width 表示移动元素大小个字节
再通过加上j*width和(j+1)*width实现元素的变换
最后通过Swap函数交换两个元素
Swap函数需要三个参数:两个元素的地址和元素的大小
由于元素的地址是以char*类型表示的,故元素大小是多大,就要交换多少次元素