zoukankan      html  css  js  c++  java
  • STL中qsort的七种用法

    qsort()  应该就是用的快排。貌似是以数据块的方式移动数据,速度较快。

    原型:
    _CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));

    解释:    qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数)
    比较函数是一个自己写的函数  遵循 int com(const void *a,const void *b) 的格式。
    当a b关系为 >  <  = 时,分别返回正值 负值 零 (或者相反)。
    使用a b 时要强制转换类型,从void * 转换回应有的类型后,进行操作。
    数组下标从零开始,个数为N, 下标0-(n-1)。

    示例:
    int nn[100],n=100;
    int com(const void *a,const void *b)
    {
        return *(int*)a-*(int*)b;
    }   

    qsort((void *)nn,n,sizeof(int),com);
    相关:
    为什麽你必须给予元素个数?(因为阵列不知道它自己有多少个元素)为什麽你必须给予 double 的大小?(因为 qsort 不知道它要排序的单位是 doubles.)为什麽你必须写那个丑陋的、用来比较 doubles 数值的函式?(因为 qsort 需要一个指标指向某个函式,因为它不知道它所要排序的元素型别)为什麽 qsort 所使用的比较函式接受的是 const void* 引数而不是 char* 引数?(因为 qsort 可以对非字串的数值排序)Bjarne Stroustrup

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


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


    三、对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);


    四、对结构体一级排序
    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 ? 1 : -1;
    }
    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);

    自己写一个纯字符串的:(temp是二维的字符串数组,j是一共需排序的字符串个数)

    int cmpstr(const void *a,const void *b)
    {
       return strcmp((char*)a,(char*)b);
    }

        qsort(temp, j,sizeof(temp[0]),cmpstr);

    七、计算几何中求凸包的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;
    }

    qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;
    sort()是STL中的标准算法
    #include<stdlib.h>
    int cmp(const void *a,const void *b)
    {
        return *((int *)b)-*((int *)a);
    }
        .
        .
         .
    qsort(q,n,sizeof(int),cmp);
        .
        .
        .
    }
    qsort对一维数组和字符串数组的排序:
    #include "stdio.h"
    #include "stdlib.h"
    int a[100];
    int cmp(const void *p,const void *q)
    {
        return (*(int*)p)-*((int*)q);
    }
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        qsort((void*)a,n,sizeof(a[0]),cmp);
        for(int i=0;i<n;i++)
          printf("%d\n",a[i]);
        //while(1);
        
    int cmp(const void *p,const void *q)
    {
        return strcmp((char*)p,(char*)q);
    }
    int main()return 0;
    }

    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    char a[20005][25];
    {
        int n,m,i,j;
        while(1)
        {
                scanf("%d%d",&n,&m);
                if(n==0&&m==0) break;
                for(i=0;i<n;i++)
                {
                   scanf("%s",a[i]);
                }
                qsort((void*)a,n,sizeof(a[0]),cmp);
                for(i=0;i<n;i++)
                   printf("%s\n",a[i]);
        }
    }


     

  • 相关阅读:
    jQuery插件开发入门
    [转]JS学习总结-技巧、方法、细节
    JS无法获取display为none的隐藏元素的宽度和高度的解决方案
    vuejs2.0运用原生js实现简单的拖拽元素功能
    HTML5效果:Canvas 实现圆形进度条并显示数字百分比
    git常用命令总结以及用github来展示你的前端页面
    jQuery 对AMD的支持(Require.js中如何使用jQuery)
    vue+springboot上传和下载附件功能
    springboot+vue实现文件上传
    Spring boot+Vue全栈开发---Spring Boot文件上传
  • 原文地址:https://www.cnblogs.com/lidabo/p/2600850.html
Copyright © 2011-2022 走看看