Qsort!

Excel排序技巧与C库函数qsort应用
本文介绍如何使用C库函数qsort实现类似于Excel的排序功能,包括对不同数据类型的排序方法,以及多级排序的具体实现。通过实例代码,详细解析了qsort的七种使用方法,涵盖整型、字符型、浮点型数组,结构体的一级和二级排序,以及字符串排序。此外,还提供了一个解决给定问题的完整代码示例,展示了如何根据不同的排序需求调用qsort函数。

例题:http://acm.hdu.edu.cn/showproblem.php?pid=1862

 

杭电1862:EXCEL排序

题目中文题目,就不用再去翻译了,只是说明一下,题目的大意

 

题目是说像excel那样进行排序,如果不知道也没关系,题目已经说明了具体的排序规则如下:

        随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。

数据组数有较多,用其他排序方法,在时间上不能够得到保证,并且涉及到多级排序,所以,用函数库自带的qsort函数还是较为方便的。

具体关于qsort资料整理如下:

 

 

C库函数qsort七种使用方法示例

七种qsort排序方法<本文中排序都是采用的从小到大排序>

一、对int类型数组排序
C++代码

  1. int num[100];  

Sample:

  1. int cmp( const void *a , const void *b )  
  2. {  
  3.       return *(int *)a – *(int *)b;  
  4. }  
  5. qsort(num,100,sizeof(num[0]),cmp);  

二、对char类型数组排序(同int类型)
C++代码

  1. char word[100];  

Sample:

  1. int cmp(const void *a ,const void *b)  
  2. {  
  3.      return *(char *)a – *(char*)b;  
  4. }  
  5. qsort(word,100,sizeof(word[0]),cmp)  

三、对double类型数组排序(特别要注意)
C++代码

  1. double in[100];  
  2. int cmp(const void *a ,const void *b)  
  3. {  
  4.      return *(double *)a > *(double *)b ? 1 : -1;  
  5. }qsort(in,100,sizeof(in[0]),cmp);  

四、对结构体一级排序
C++代码

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

五、对结构体二级排序
C++代码

1. typedef struct In{  

2.     int x;int y;  

3. }s[100];  

4. //按照x从小到大排序,当x相等时按照y从大到小排序  

5. int cmp(constvoid *a , const void *b)  

6. {  

7.      In *c = (In *)a;  

8.      In *d = (In *)b;  

9.      if(c->x != d->x)return c->x – d->x;  

10.           elsereturn d->y – c->y;  

11.      }  

12.      qsort(s,100,sizeof(s[0]),cmp);  

六、对字符串进行排序
C++代码

  1. struct In{  
  2.     int data; char str[100];  
  3. }s[100];  
  4. //按照结构体中字符串str的字典顺序排序  
  5. int cmp( const void *a , const void *b )  
  6. {  
  7.      returnstrcmp( (*(In *)a).str ,(*(In *)b).str);  
  8. }  
  9. qsort(s,100,sizeof(s[0]),cmp);  

七、计算几何中求凸包的cmp
C++代码

  1. int cmp(constvoid *a,constvoid *b)  
  2. //重点cmp函数,把除了1点外的所有点,旋转角度排序  
  3. {  
  4.      struct point *c=(point *)a;  
  5.      struct point *d=(point *)b;  
  6.      if( calc(*c,*d,p[1]) < 0) return 1;  
  7.      elseif( !calc(*c,*d,p[1])  
  8.     && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y))  
  9.     //如果在一条直线上,则把远的放在前面  
  10.     return 1; elsereturn -1;  
  11. }  

PS: 其中的qsort函数包含在的头文件里,strcmp包含在的头文件里

 

主要的理解的地方就是:

 

五、对结构体二级排序
C++代码

1. typedef struct In{  

2.     int x;int y;  

3. }s[100];  

4. //按照x从小到大排序,当x相等时按照y从大到小排序  

5. int cmp(cons tvoid *a ,const void *b)  

6. {  

7.      In *c = (In *)a;                                           //定义另一个指针以此代替两个原指针,再进行比较

8.      In *d = (In *)b;  

9.      if(c->x != d->x)return c->x – d->x;       //如果相等的话就进行另一项排序,只不过是排序的对象发生变化,

10.           elsereturn d->y – c->y;                  // 根据排序的方式(降序、升序)调整其先后位置

11.      }  

12.      qsort(s,100,sizeof(s[0]),cmp);          // 此函数包含在头文件stdlib.h中

        s为要排序的数组名,接着是数组长度,然后是单个元素的长度,最后是排序方式的函数(由自己编写)

在编写比较方式函数的时候,要注意指针的运用,以此提高简洁性同时应该注意多级排序时的先后顺序

 

 

最后在此附上题目代码:(仅供参考)

 

# include<stdio.h>
# include<stdlib.h>
# define M 100000
# include<string.h>
struct ln{
    int xuehao;
    char name[10];
    int score;
};
struct ln a[M+10];

int cmpx(const void *a,const void *b){           //按学号排序
    return (*(ln*)a).xuehao-(*(ln*)b).xuehao;
}

int cmpn(const void *a,const void *b){        // 先按按名字的字典排序再按序号排序
    ln *c=(ln*)a;
    ln *d=(ln *)b;
    if(!strcmp(c->name,d->name))            //此处需注意 指针
    return c->xuehao-d->xuehao;
    else
    return strcmp(c->name,d->name);
}

int cmps(const void *a,const void *b){          // 先按成绩排序再按学号排序
    ln *c=(ln*)a;
    ln *d=(ln *)b;
    if(c->score==d->score)
    return  c->xuehao-d->xuehao;
    else
    return c->score-d->score;
}

int main(){
    int n,c;
    int i;
    int t=0;
    while(scanf("%d%d",&n,&c)&&n){
        t++;
        for(i=0;i<n;i++){                                                            //将学生信息以此输入
            scanf("%d%s%d",&a[i].xuehao,a[i].name,&a[i].score);
        }
        if(c==1)                                                               //选择排序方式
        qsort(a,n,sizeof(a[0]),cmpx);
        if(c==2)
        qsort(a,n,sizeof(a[0]),cmpn);
        if(c==3)
        qsort(a,n,sizeof(a[0]),cmps);
       
        printf("Case %d:\n",t);
        for(i=0;i<n;i++){                                             //对结果输出
            printf("%06d %s %d\n",a[i].xuehao,a[i].name,a[i].score);
        }
    }
    return 0;
}
           

   整理人:李富昌

整理时间:20140807

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值