STl库中的快排

acm做题过程中经常要用到排序,一般都选用快排,在此对快排做个总结

其中代码用c表示


一.总结

  1. #include<stdio.h>
  2. #include<stdlib.h> //必须包含该头文件
  3. struct 结构体类型名 //数据类型=“struct”+“空格”+“结构体类型名”
  4. {
  5. 数据类型1 变量名1
  6. 数据类型2 变量名2//若要使用结构快排,结构体一定要定义在快排前面
  7. }数组名[数组大小];
  8. int 自定义函数名字(const void *a,const void *b)
  9. {
  10. return(*(数据类型 *)a)>(*(数据类型 *)b)?1:-1; //从小到大进行排序(从大到小排序只要把“>”换成“<”即可)
  11. }
  12. qsort(数组名,数组大小,sizeof(数据类型),自定义函数名字); //调用快排(写在调用的地方)


下面是一些具体的例子


二. 对于普通数组进行快排

1.qsort函数

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int cmp(const void *a,const void *b)
  4. {
  5. return(*(int *)a)>(*(int *)b)?1:-1; //对int型数组从小到大进行排序
  6. }
  7. qsort(p,n,sizeof(int),cmp); //调用快排(其中p是int型数组名,n是数组长度)


2.sort函数

同样c++的STL库中也提供了sort排序函数,可以直接拿来使用。在一些题目中,使用上述方法所导致的超时往往换成sort函数即可解决


①sort是一个改进版的qsort. std::sort函数,实验证明sort一般要快于qsort

②优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。

③sort是qsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写 cmp 函数


代码如下:

  1. #include<stdio.h>
  2. #include <algorithm> //必须包含该头文件
  3. using namespace std;
  4. int main()
  5. {
  6. int p[10];
  7. int i;
  8. for(i=0;i<10;i++)
  9. scanf("%d",&p[i]);
  10. sort(p,p+10); //调用从小到大快排(p是数组名,p+10中10表示数组长度)
  11. for(i=0;i<10;i++)
  12. printf("%d ",p[i]);
  13. return 0;
  14. }


  1. #include<stdio.h>
  2. #include <algorithm> //必须包含该头文件
  3. #include<functional> //必须包含该头文件
  4. using namespace std;
  5. int main()
  6. {
  7. int p[20];
  8. int i;
  9. for(i=0;i<10;i++)
  10. scanf("%d",&p[i]);
  11. sort(p,p+10,greater<int>()); //调用从大到小快排(p是数组名,p+10中10表示数组长度)
  12. for(i=0;i<10;i++)
  13. printf("%d ",p[i]);
  14. return 0;
  15. }


三.以绝对值排序,按真实值输出

  1. #include<math.h>
  2. #include<stdlib.h>
  3. int cmp(const void *a,const void *b)
  4. {
  5. return abs(*(int *)a)>abs(*(int *)b)?1:-1; //abs函数求绝对值
  6. }
  7. qsort(p,n,sizeof(int),cmp);


四.对于字符串进行快排

1.以升序

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. struct stu //将字符串存到结构体中的q
  5. {
  6. char q[50];
  7. }p[1005];
  8. int cmp(const void *a,const void *b) //结构体数组p中,以其成员字符串q为关键字,对p从小到大进行排序
  9. {
  10. if(strcmp((*(struct stu*)a).q,(*(struct stu*)b).q)>=0)
  11. return 1;
  12. else if(strcmp((*(struct stu*)a).q,(*(struct stu*)b).q)<0)
  13. return -1;
  14. return 0;
  15. }
  16. qsort(p,n,sizeof(struct stu),cmp); //调用快排(其中p是struct stu型数组名,n是数组长度)


2.以降序

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. struct stu
  5. {
  6. char q[50];
  7. }p[1005];
  8. int cmp(const void *a,const void *b) //结构体数组p中,以其成员字符串q为关键字,对p从大到小进行排序
  9. {
  10. if(strcmp((*(struct stu*)a).q,(*(struct stu*)b).q)>=0)
  11. return -1;
  12. else if(strcmp((*(struct stu*)a).q,(*(struct stu*)b).q)<0)
  13. return 1;
  14. return 0;
  15. }
  16. qsort(p,n,sizeof(struct stu),cmp);


五.对于多级结构体数组进行快排

1.对于一级

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct stu
  4. {
  5. int a;
  6. int b;
  7. }p[1005];
  8. int cmp(const void *a,const void *b)
  9. {
  10. return(*(struct stu*)a).b<(*(struct stu*)b).b?1:-1; //结构体数组p中,以其成员b为关键字,对p从大到小进行排序
  11. }
  12. qsort(p,n,sizeof(struct stu),cmp);

2.对于多级(在此以二级为例)

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. struct stu
  4. {
  5. int a;
  6. int b;
  7. }p[1005];
  8. int cmp(const void *a,const void *b) //结构体数组p中,以其成员a为关键字,对p从大到小进行排序
  9. {
  10. if((*(struct stu*)a).a==(*(struct stu*)b).a)
  11. return(*(struct stu*)a).b<(*(struct stu*)b).b?1:-1; //若p中任意两p[i]的成员a相等,则再以其两的成员b为关键字从大到小排序
  12. else
  13. return(*(struct stu*)a).a<(*(struct stu*)b).a?1:-1;
  14. }
  15. qsort(p,n,sizeof(struct stu),cmp);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值