qsort()是C标准库中的一个通用的排序函数.
qsort 的函数原型是:
void qsort (void* base, size_t num, size_t size, int (*compare)(const void*, const void*));
各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针
qsort既能对整型数据进行排序也能对浮点型数据进行排序.但我在练习使用qsort函数排序三种数据类型时(分别是: int, double, char)遇到了一个奇怪的情况,对于 int 和 char 类型的数据排序按照预期效果成功排序,数组中的数据仍然是乱序的.
问题程序如下:
上面这个程序的输出结果为:
从结果中可以看出qsort()对double类型的数据并没有排序成功!
解决:
后来才发现,这个问题出在了比较函数compare1()上了。qsort()要求compare1()函数的返回值必须是int类型。如上图所示,compare()函数的返回值竟然不是int而是double类型。因此,将上述程序改写成下面的样子,问题解决。(没有截图,贴上了源代码)
#include <stdio.h>
#include <stdlib.h>
int compare(const void* a,const void* b){
return (*(int*)a - *(int*)b);
}
int compare1(const void* a,const void* b){
double ret = *(double*)a - *(double*)b;
if(ret > 0){
return 1;
}
else if(ret < 0){
return -1;
}
return 0;
}
int compare2(const void* a,const void* b){
return (*(char*)a - *(char*)b);
}
int main(){
int arr[] = {3, 5, 7, 1, 4, 2, 6};
qsort(&arr, 7, sizeof(arr[0]), compare);
int i = 0;
for( ; i < 7; ++i ){
printf("%d ",arr[i]);
}
printf("\n");
double arr1[] = {3.24, 5.56, 7.77, 1.34, 4.45, 2.56, 6.78};
qsort(&arr1, 7, sizeof(arr1[0]), compare1);
int j = 0;
for( ; j < 7; ++j ){
printf("%lf ",arr1[j]);
}
printf("\n");
char arr2[] = {'d', 'e', 'a', 'c', 'b', 'f', 'g'};
qsort(&arr2, 7, sizeof(arr2[0]), compare2);
int k = 0;
for( ; k < 7; ++k ){
printf("%c ",arr2[k]);
}
printf("\n");
return 0;
}
排序成功的结果: