C++ STL sort和qsort函数

一、sort使用:

1、需要头文件:include<algorithm>

2、使用方法

用法(1):sort(begin,end);//默认是从小到大排序,begin表示要排序元素的首地址,end表示要排序元素的结束地址

int a[n];

sort(a,a+n);

用法(2):sort(begin,end,cmp);//自定义排序函数cmp,要实现从大到小排序,需要自己写排序函数

int a[n];

sort(a,a+n.cmp);

//实例1:默认从小到大排序
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int a[10]={9,6,3,8,5,2,7,4,1,0};
    for(int i=0;i<10;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    sort(a,a+10);
    for(int i=0;i<10;i++)
    cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}
//实例2:自定义排数函数,从大到小排序
#include<iostream>
#include<algorithm>
using namespace std;

//自定义排序函数
bool cmp(int a,int b){
    return a>b;//从大到小排序,从小到大排序为a<b
}
int main()
{
    int a[10]={9,6,3,8,5,2,7,4,1,0};
    for(int i=0;i<10;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    sort(a,a+10,cmp);
    for(int i=0;i<10;i++)
    cout<<a[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}
//实例3:不自定义排序函数,使用C++ STL强大功能实现排序规则,
从小到大排序,比较函数设置为:less<数据类型>
从大到小排序,比较函数设置为:greater<数据类型>
#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
    int a[10]={9,6,3,8,5,2,7,4,1,0};
    for(int i=0;i<10;i++)
        cout<<a[i]<<" ";
    cout<<endl;
    sort(a,a+10,greater<int>);//从大到小排序,从小到大则为less<int>
    for(int i=0;i<10;i++)
    cout<<a[i]<<" ";
    cout<<endl;
    system("pause");
    return 0;
}

注:以上实例换成char类型的数组也是一样的。


3、结构类型的比较函数(实现按多字段排序)

struct point{

int x;

int y;

};

//先按x降序排序,再按y升序排序

bool cmp(point a,point b){

if(a.x!=b.x) return a.x>b.x;//x降序排序

else return a.y<b.y;//x相等时,y升序排序

}

二、qsort

1、需要头文件:include<stdlib.h>

2、使用方法

(1) qsort(void*,size_t,size_t,int*(const void*,const void*));

     qsort(数组名,数组元素个数,每个元素大小,比较函数);

     int a[n];

     qsort(a,n,sizeif(a[0]),cmp);

(2) 比较函数的格式为:int cmp(const void*a ,const void *b){}

     1) 返回值为负数:*a排在*b的前面

     2) 返回值0:*a和*b那个在前面都行

     3) 返回值为正数:*a在*b的后面

     所以,return *a - *b;//升序排序

                return *b - *a;//降序排序

//实例1:从大到小排序
#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;

//自定义比较函数,从大到小排序
int compare(const void *a,const void *b)
{
     return *(int*)b-*(int*)a;//从大到小排序,若从小到大牌组为:*(int*)a-*(int*)b
}
int main()
{
     int a[20]={2,4,1,23,5,76,0,43,24,65},i;
     for(i=0;i<20;i++)
        cout<<a[i]<<" ";
     cout<<endl;
     qsort((void*)a,20,sizeof(int),compare);
     for(i=0;i<20;i++)
        cout<<a[i]<<" ";
     cout<<endl;
     system("pause");
     return 0;
}

3、结构类型的比较函数(实现按多字段排序)

struct point{

int x;

int y;

};

int cmp(const void*a,const void*b ){

point* m=(point*)a;

point* n=(point*)b;

if(m->x!=n->x) return n->x - m->x;//先按x降序

else return m->y - n->y; //再按y升序

}

4、double类型的比较函数

int cmp(const  void* a,const void* b){

double * m=(double*)a;

double* n=(double*)b;

return (*m)>(*n )? 1 : -1;//升序,(*m)>(*n )? -1 : 1;降序

}


5、对字符串排序

struct data{

int a;

char b[100];

};

int cmp(const void* a,const void* b){

data *m=(data*)a;

data *n=(data*)b;

return strcmp(m->b,n->b);//strcmp(a,b);//a>b,返回1;a<b,返回-1;a=b,返回0

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值