qsort函数的介绍与使用已在前面博客写过:函数 qsort 详解 ,这篇博客我们用冒泡排序模拟实现一下qsort函数。
首先我们实现一个冒泡排序的函数
void Bubblesort(int* a, int sz)//sz为数组元素个数
{
int i = 0, j = 0,tmp;
for (j = 0; j < sz; j++)
{
for (i = 0; i < sz - 1 - j; i++)
{
if (a[i] > a[i + 1])
{
tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
}
}
}
}
我们用冒泡排序的方式实现qsort
void Swap(char*x,char*y,int sz)
{
int i = 0;
char tmp = 0;
for (int i = 0; i < sz2; i++)
{
tmp = *x;
*x = *y;
*y = tmp;
y++;
x++;
}
}
void Bubblesort(void*a,int sz1,int sz2,int (*compare)(const void *x,const void*y ))
{
char* b = (char*)a;
for (int j = 0; j < sz1; j++)
{
for (int i = 0; i < sz1 - 1 - j; i++)
{
int flag = compare(b + (i * sz2), b + ((i + 1) * sz2));
if (flag<0)
{
Swap(b + (i * sz2), b + ((i + 1) * sz2),sz2);
}
}
}
}
我们先看一下Bubblesort函数
void Bubblesort(void*base,int sz1,int sz2,int (*compare)(const void *x,const void*y ))
它有四个参数
- base-- 指向要排序的数组的第一个元素的指针。
- sz1 -- 由 base 指向的数组中元素的个数。
- sz2 -- 数组中每个元素的大小,以字节为单位。
- compare -- 函数指针,用来接受比较两个元素的函数,该函数使用者自己实现。
尤其需要注意的是第四个参数,compare,它是需要根据数组中元素不同类型单另实现的函数。
我们在看一下Swap函数
void Swap(char*x,char*y,int sz)
x,y是用来接收要被比较的两个数的地址,sz是数据的大小,单位为字节。
下来我们看一下compare函数的实现
int compare (const void *x,const void*y )
参数只有两个,x和y,要比较的两个数据的地址
排整型和浮点型
int compare(const void* x, const void* y)
{
return *(int*)x - *(int*)y;
}
排字符串
int compare(const void* x, const void* y)
{
strcmp((char*)x, (char*)y);
}
对结构体数组排序其实也是对以上三种类型的排序。
建立一个结构体
struct stu
{
char name[20];
int age;
};
按名字排序
int cmp_stu_age(const void* x, const void* y)
{
strcmp(((struct stu*) x)->name , ((struct stu*)y)->name);
}
按年龄排序
int cmp_stu_age(const void* x, const void* y)
{
return (((struct stu*) x)->age- ((struct stu*)y)->age);
}