文章目录
一、qsort介绍
原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
Cplusplus中的解释:
对数组的元素进行排序
对数组中由 指向的元素进行排序,每个元素字节长,使用该函数确定顺序。
此函数使用的排序算法通过调用指定的函数来比较元素对,并将指向它们的指针作为参数。
该函数不返回任何值,但通过重新排序数组的元素(如 所定义)来修改指向的数组的内容。
等效元素的顺序未定义。
二、qsort详解
头文件:#include<stdlib.h>
原型:void qsort (void* base, size_t num, size_t size, int (*compar)(const void*,const void*))
base :可为数组,也可为指针(注:此指针应指向数组);
size_t num:数组长度,根据cplusplus定义,他为unsigned int
size_t size:数组元素所占字节,据cplusplus定义,他为unsigned int
compare:指向比较两个元素的函数的指针。
重复调用此函数以比较两个元素。它应遵循以下原型:qsort
int compar (const void* p1, const void* p2);
即他也可以为一个函数名.
代码如下(示例):
/* qsort example */#include <stdio.h>
/* printf */#include <stdlib.h> /* qsort */
int values[] = { 40, 10, 100, 90, 20, 25 };
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}//此处为整形递增排序
int main ()
{
int n;
qsort (values, 6, sizeof(int), compare);
for (n=0; n<6; n++)
printf ("%d ",values[n]);
return 0;
}
重点:
此函数最主要的部分其实在于int (*compar)(const void*,const void*);
因为主要改变的都在在个部分,包括数据类型以及升降序.而其他部分其实就按照规则填入便可.其中size_t size可用sizeof()来计算其中一个数组元素大小便可
三、类型
Int
int compare (const void * a, const void * b)
{
return *(double*)a >*(double *)b ? 1 : -1;//升序
return *(double*)a <*(double *)b ? 1 : -1;//降序
}
double
int compare (const void * a, const void * b)
{
return *(double*)a >*(double *)b ? 1 : -1;//升序
return *(double*)a <*(double *)b ? 1 : -1;//降序
}
字符
int compare (const void * a, const void * b)
{
return *(char *)a - *(char *)b;//升序
return *(char *)b - *(char *)a;//降序
}
字符串
int compare (const void * a, const void * b)
{
return strcmp(*(const char**)a, *(const char**)b);//升序
return strcmp(*(const char**)b, *(const char**)a);//降序
}
四、实例代码
#include <stdio.h>
#include <stdlib.h> /* qsort */
//Int
int compare1(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);//升序
//return ( *(int*)b - *(int*)a );//降序
}
//Double
int compare2(const void* a, const void* b)
{
return *(double*)a > *(double*)b ? 1 : -1;//升序
//return *(double*)a < *(double*)b ? 1 : -1;//降序
}
//字符
int compare3(const void* a, const void* b)
{
return *(char*)a - *(char*)b;//升序
//return *(char*)b - *(char*)a;//降序
}
//字符串
int compare4(const void* a, const void* b)
{
return strcmp(*(const char**)a, *(const char**)b); // 升序
//return strcmp(*(const char**)b, *(const char**)a);//降序
}
int main()
{
int values1[] = { 40, 10, 100, 90, 20, 25 };
double values2[] = {1.2,0.42,0.2,8,3.14,15.2};
char values3[] = { 'e', 's', 'a', 'w', 'k', 'l' };
char* values4[] = { "nobody","everything","anything","nonthing","anybody","something" };
int n;
qsort(values1, 6, sizeof(int), compare1);
qsort(values2, 6, sizeof(double), compare2);
qsort(values3, 6, sizeof(char), compare3);
qsort(values4, 6, sizeof(char*), compare4);
printf("Int:");
for (n = 0; n < 6; n++)
printf("%d ", values1[n]);
printf("\n");
printf("double:");
for (n = 0; n < 6; n++)
printf("%.2lf ", values2[n]);
printf("\n");
printf("字符:");
for (n = 0; n < 6; n++)
printf("%c ", values3[n]);
printf("\n");
printf("字符串:");
for (n = 0; n < 6; n++)
printf("%s ", values4[n]);
printf("\n");
return 0;
}