qsort函数定义
快速排序是目前公认的一种比较好的排序算法,是根据二分法写的。因为他速度很快,系统也在库里实现这个算法。 这就是qsort函数(全称quicksort)。其声明在stdlib.h文件中,其时间复杂度为n*log(n)
功能:对某种类型数组按照某种规则排序(就是让数组元素的地址在数组中移动);
头文件:stdlib.h
用法: void qsort(void* base, num, size_int ,int(__cdecl*compare)
参数: 1 待排序数组,排序之后的结果仍放在这个数组中
2 数组中待排序元素数量
3 各元素的占用空间大小(单位为字节)
4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)
qsort函数比较函数cmp
qsort要求提供一个自己定义的比较函数cmp。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
比较函数 int cmp(const void *a, const void *b) 中让两个元素的地址作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。
qsort的比较函数是 int cmp ( const void * a, const void * b ),而返回负数表示ab顺序;返回负数表示顺序相反,ba顺序;返回0表示二者“相等”,顺序不确定(因此返回的正负千万要明确)
qsort中几种常见的比较函数示例
一、对int型数组排序
升序:
int cmp_int(const void* a , const void* b)//参数格式固定不能变,针对不同类型数据只能变函数体
{
return *((int*) a) - *((int*) b);//升序
}
//可见,参数列表是两个无意义指针,现在他要去指向你的元素。所以需要转换为你当前的类型,然后取值,作差。默认升序排列(从小到大),也就是说,这个升序函数也可以只声明个函数名就可以。
如果想降序排列返回*b-*a即可。
降序:
int cmp_int(const void* a , const void* b)//参数格式固定不能变,针对不同类型数据只能变函数体
{
return *(int* b) - *(int* a);//升序
}
示例如下:
函数调用示例:qsort(num, 50, sizeof(int), mycmp);
二、对char型数组排序
int compare1(const void *a, const void *b)//对字符数组中的字符按照升序排序
{
return *(char *)a - *(char*)b;
}
int compare2(const void *a, const void *b)//对字符数组中的字符按照升序排序
{
return *(char *)b - *(char*)a;
}
示例:将字符串数组中的元素按照长度排序
qsort(num, 50, sizeof(int), mycmp);针对连续数组本身的元素进行排序。
通过指针数组方式建立的字符串数组(并且不是直接初始化 的),无法进行qsort排序。因为存储并不是像一开始初始化一样,存储结构是一维连续的。是二维的。
三、对double型数组排序
一定注意,浮点数作差返回为int型之后,就不能表达出大小性质了
double in[100];
int cmp_double(const void* a , const void* b)
{
return *(double* a) > *(double* b) ? 1 : -1; //特别注意
}
//在对浮点或者double型的一定要用三目运算符,因为如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系
四、对字符串进行排序
五、对结构体数组进行排序
使用 qsort
的灵魂魅力在于比较函数的编写!!!