c语言qsort函数的应用

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即可将升序排序改为降序排序

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值