qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)
功能
对一个数组进行排序(任意类型数组)
函数定义
void qsort(void* base,size_t num,size_t width,int(__cdeclcompare)(const void,const void*));
参数
qsort(1,2,3,4);
1:排序数组首地址;
2:排序个数;
3:各元素的占用空间大小(可用sizeof()函数计算):
4:指向函数的指针,用于确定排序的顺序(需要自定义一个比较函数);
可根据所需排序的类型来写比较函数(比较函数的函数名任意)
比较函数的参数在qsort函数的定义中以固定
对int类型数组排序
#include<stdio.h>
#include<stdlib.h>
int name(const void*a,const void*b)
{
int*pa=(int*)a;
int*pb=(int*)b;
return *pa-*pb;
}
int main()
{
int a[5]={5,3,1,5,2},i;
qsort(a,5,sizeof(int),name);
for(i=0;i<5;i++)printf("%d ",a[i]);
}
输出如下
1 2 3 5 5
对long long类型排序
#include<stdio.h>
#include<stdlib.h>
int name(const void*a,const void*b)
{
long long*pa=(long long*)a;
long long*pb=(long long*)b;
int flag;
if(*pa-*pb<0)flag=-1;
else flag=1;
return flag;
//因为long long的范围较大,而比较函数的返回值是int,
//所以对(*pa-*pb)需要进行一些处理
}
int main()
{
long long a[5]={123456789123,987654321654,6,1,5},i;
qsort(a,5,sizeof(long long),name);
for(i=0;i<5;i++)printf("%lld ",a[i]);
}
输出如下
1 5 6 123456789123 987654321654
对char类型排序
#include<stdio.h>
#include<stdlib.h>
int name(const void*a, const void*b)
{
char*pa = (char*)a;
char*pb = (char*)b;
int flag=*pa - *pb
return flag;
}
int main()
{
//int i;
char a[5] = { "dcba" };
qsort(a, 4, sizeof(char), name);
printf("%s ", a);
}
输出如下
abcd
对字符串排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>`
int name(const void*a, const void*b)
{
char*pa = (char*)a;
char*pb = (char*)b;
int flag=strcmp(pa, pb)
return flag;
}
int main()
{
int i;
char a[5][5] = { {"Bom"},{"Aom"},{"Mary"},{"Dili"},{"Fork"} };
qsort(a, 5, sizeof(a[0]), name);
for (i = 0; i < 5; i++)printf("%s\n", a[i]);
}
输出如下
Aom
Bom
Dili
Fork
Mary
对double类型排序
#include<stdio.h>
#include<stdlib.h>
int name(const void*a, const void*b)
{
double*pa = (double*)a;
double*pb = (double*)b;
int flag;
if (*pa - *pb < 0)flag = -1;
else flag = 1;
return flag;
}
int main()
{
int i;
double a[5] = { 1.0,3.0,2.0,2.0,0.0};
qsort(a, 5, sizeof(double), name);
for (i = 0; i < 5; i++)printf("%lf\n", a[i]);
}
输出如下
0.000000
1.000000
2.000000
2.000000
3.000000
结构体数组的排序与上述类型相似就不在此赘述
总结
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int name(const void*a, const void*b)
{
排序的数组类型*pa = (排序的数组类型*)a;
排序的数组类型*pb = (排序的数组类型*)b;
flag=处理过后的*pa-*pb;//处理方法参考long long类型
return flag;
}
int main()
{
*定义数组*
qsort(排序数组的第一个的地址, 排序个数(不一定是数组大小), sizeof(排序的数组类型), name);
}
将*pa-*pb改为 *pb-*pa即可将升序排序改为降序排序