前言
关于qsort函数的使用我们在之前的博客中已经详细介绍过了:
C语言中提供的排序算法 qsort 的使用
以及快排的相关如下:
图文详解快速排序
所以话不多说,直接来实现c中自带的qsort函数,具体代码如下:
要点是:要使得该qsort可以对任意结构体或字符串数组等进行排序
代码
// 定义函数指针
typedef int(cmp_t)(const void* a, const void* b);
int cmp(const void* a, const void* b) {
int p = *((int*)a);
int q = *((int*)b);
return p-q;
} // 该cmp是用户自定义的比较函数
// 在本次程序中想实现的是数组的排序,所以如上
// 如果想要比较结构体的大小或者其他的,应该重新定义一个比较函数
// 以下两个程序才组成了qsort
int my_qsort_partition(void* arr, int n, int nsize, cmp_t cmp) {
unsigned char key[nsize];
memcpy(key, arr, nsize);
int i=0, j=n-1;
while(i < j){
while(i<j && cmp(key, arr+j*nsize) <= 0) --j;
memcpy(arr+i*nsize, arr+j*nsize, nsize);
while(i<j && cmp(key, arr+i*nsize) >= 0) ++i;
memcpy(arr+j*nsize, arr+i*nsize, nsize);
}
memcpy(arr+i*nsize, key, nsize);
return i;
}
void my_qsort(void* arr, int n, int nsize, cmp_t cmp){
if(n <= 1) return;
int pot = my_qsort_partition(arr, n, nsize, cmp);
my_qsort(arr, pot, nsize, cmp);
my_qsort(arr+(pot+1)*nsize, n-pot-1, nsize, cmp);
}