• 关于排序--sort()和qsort()使用


    一、sort()函数的使用
    使用sort()函数的时候要加上头文件#include<algorithm>和using namespace std
    这个函数接收两个或者三个参数。
    第一个参数是区间的首地址,第二个参数是区间尾地址的下一个地址,也就是说排序的区间是[a,b).
    简单说就是对于int a[len],要对a[0]到a[len-1]进行排序,调用sort(a,a+len)即可。默认的是升序。

    排序的数据类型不局限于整数,只要定义了小于运算的类型都是可以的,如string。

    如果没有定义小于运算的数据类型,或者改变一下排序的规则,这个时候就要使用第三个参数--比较函数。 
    比较函数是用户自定义的函数,返回bool类型,这个函数规定了用户自定义的“小于”如果想进行降序排列,如下:
    bool cmp(int a,int b)
    {
        return a>b;
    }
    sort(a,a+len,cmp)

    例子:有一个node类型的数组node arr[100],想对其按照如下规则进行排序:
    先按a的值升序排序,如果a的值相同,在按b的值降序排序,如果b还相同,就按c的值降序排序。那么cmp()函数为:
    struct node
    {
        int a;
        int b;
        double c;
    }

    bool cmp(node x,node y)
    {
        if(x.a!=y.a)            return x.a<y.a;
        else if(x.b!=y.b)     return x.b>y.b
        else if(x.c!=x.c)      return x.c>y.c;
    }
    sort(arr,arr+100,cmp);



    二、qsort()函数的使用
    qsort()是C中的排序函数,其头文件是#include<stdio.h>
    sort()是C++中的排序函数,其头文件是#include<algorithm>

    函数原型:
    void  qsort( void *base, size_t num, size_t width, int (__cdecl *cmp ); int  cmp (const void *elem1, const void *elem2 ) ); 

    参数意义:
    base:需要排序的目标数组开始地址
    num:目标数组元素个数
    width:目标数组中每一个元素的长度
    cmp:函数指针,指向比较函数

    1、对int类型数组排序
    int num[100];
    int cmp(const void *a,const void *b)
    {
        return *(int *)a-*(int *)b;
    }
    qsort(num,100,sizeof(num[0]),cmp);

    2、对char类型数组排序
    char word[100];
    int cmp(const void *a,const void *b)
    {
        return *(char *)a-*(char *)b;
    }
    qsort(word,100,sizeof(word[0]),cmp);

    3、对double类型数组排序
    double in[100];
    int cmp(const void *a,const void *b)
    {
        return *(double *)a>*(double *)b?1:-1;
    }
    qsort(in,100,sizeof(in[0]),cmp);

    4、对结构体排序
    struct In  
    {  
        double data;  
        int other;  
    }s[100]  
    //按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写  
    int cmp( const void *a ,const void *b)  
    {  
        return ((In *)a)->data - ((In *)b)->data ;  
    }  
    qsort(s,100,sizeof(s[0]),cmp);  

    struct In  
    {  
        int x;  
        int y;  
    }s[100];  
    //按照x从小到大排序,当x相等时按照y从大到小排序  
    int cmp( const void *a , const void *b )  
    {  
        struct In *c = (In *)a;  
        struct In *d = (In *)b;  
        if(c->x != d->x) 
            return c->x - d->x;  
        else 
            return d->y - c->y;  
    }  
    qsort(s,100,sizeof(s[0]),cmp);  

    struct In  
    {  
        int data;  
        char str[100];  
    }s[100];  
    //按照结构体中字符串str的字典顺序排序  
    int cmp ( const void *a , const void *b )  
    {  
        return strcmp( ((In *)a)->str , ((In *)b)->str );  
    }  
    qsort(s,100,sizeof(s[0]),cmp);  


    5、计算几何中凸包的cmp
    int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序  
    {  
        struct point *c=(point *)a;  
        struct point *d=(point *)b;  
        if( calc(*c,*d,p[1]) < 0)
             return 1;  
        else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) 
        //如果在一条直线上,则把远的放在前面  
            return 1;  
        else
            return -1;  
    }




  • 相关阅读:
    几个不同的关键XPath概念
    go get 下载的包放在哪里呢?
    之前写的关于chromedp的文章被别人转到CSDN,很受鼓励,再来一篇golang爬虫实例
    微信小程序填坑之旅(2)-wx.showLoading的时候,仍能点击穿透,造成重复点击button的问题
    微信小程序填坑之旅(1)-app.js中用云开发获取openid,在其他页上用app.globaldata.openid获取为空
    JS 定时器-setInterval、clearInterval、setTimeout
    微信小程序开发入门教程(四)---自己动手做个小程序
    MT【247】恒成立画图像
    MT【246】方程根$acksim$图像交点
    MT【245】小概率事件
  • 原文地址:https://www.cnblogs.com/gt123/p/3509997.html
Copyright © 2020-2023  润新知