结构体排序

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;
 
}

--------------------- 
作者:孤海浮灯 
来源:优快云 
原文:https://blog.youkuaiyun.com/u014767460/article/details/24099743 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值