qsort sort 结构体排序

qsort

函数原型:

voidqsort( void *base, size_t num, size_t width, int (__cdecl *compare )

int  compare (const void *elem1, const void *elem2 ) );

sort

函数原型:

void sort (RandomAccessIterator first, RandomAccessIterator last);

void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp)

Compare cmp(elemtype a,elemtype b)
qorst 排序总结

一:int 型 char型 double型(基本类型)

int  num[100];
int  cmp ( const void *a , const void *b )

{
   return *(int *)a - *(int *)b;  //升序排序
 //return*(int *)b - *(int *)a; //降序排序
/*可见:参数列表是两个空指针,现在他要去指向你的数组元素。所以转型为你当前的类型,然后取值
 实质:根据返回值判断前后顺序
*/
}
qsort(s,n,sizeof(s[0]),cmp);


验证程序:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

int s[10000],n,i;

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

{

      return(*(int *)b-*(int *)a);  //实现的是升序排序

}

int main()

{

      // 输入想要输入的数的个数

     scanf("%d",&n);

     for(i=0;i<n;i++)

     scanf("%d",&s[i]);

     qsort(s,n,sizeof(s[0]),cmp);

     for(i=0;i<n;i++)

        printf("%d ",s[i]);

     return(0);

}


char

char word[100];

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

{

    return *(char *)a - *(char *)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;

//返回值的问题,显然cmp返回的是一个整型,所以避免double返回小数而被丢失,用一个判断返回值。

}

qsort(in,100,sizeof(in[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);


二: 结构体排序

一级排序:

struct In

{

   double data;

    int index;

}s[100]

 

//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写

 

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

{

    return (*(In *)a).data > (*(In *)b).data ? 1 : -1;

   //注意,这条语句在VC6.0环境下运行可能会出错,但是并不是语句错了,而是你要先 Build ,或者全部重建。总之语句是对的。

   /*

    或者你可以将这上面1条语句改成下面这3条语句

   struct In *aa = (In *)a;

   struct In *bb = (In *)b;

   return aa->data > bb->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);

 


sort

sort相对qosrt使用简单,下面一个例子,解决所有问题。

NYOJ 966 不相交子区间

#include<stdio.h>

#include<algorithm> //引入包含sort函数的头文件

using namespace std;//引入sort函数

typedef struct node

{

   int begin;

   int end;

}data[1001];

bool cmp(node a,node b)

{

    if(a.end==b.end) return a.begin>b.begin;

    return a.end<b.end;

}

data a;

int main()

{

    int n,i,count,k=1;

    node x;

    while(scanf("%d",&n)!=EOF)

    {

        for(i=0;i<n;i++)

        {

            scanf("%d%d",&x.begin,&x.end);

            if(x.begin>x.end) swap(x.begin,x.end);

            a[i].begin=x.begin;

            a[i].end=x.end;

        }

        sort(a,a+n,cmp);

        count=1;

        int temp=a[0].end;

        for(i=1;i<n;i++)

        {

            if(a[i].begin>temp)

            {

                count++;

                temp=a[i].end;

            }

        }

        printf("Case %d:\n",k++);

        printf("%d.\n",count);

    }

    return 0;

}


 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值