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); }