C库函数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 ,const void *b)  
  7. {  
  8.       return (*(In *)a).data > (*(In *)b).data ? 1 : -1;  
  9. }  
  10. qsort(s,100,sizeof(s[0]),cmp);  

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

  1. struct In {  
  2.     int x; int y;  
  3. }s[100];  
  4. //按照x从小到大排序,当x相等时按照y从大到小排序  
  5. int cmp( const void *a , const void *b )  
  6. {  
  7.      struct In *c = (In *)a;  
  8.      struct In *d = (In *)b;  
  9.      if(c->x != d->x) return c->x – d->x;  
  10.      else return 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.      return strcmp( (*(In *)a)->str , (*(In *)b)->str );  
  8. }  
  9. qsort(s,100,sizeof(s[0]),cmp);  

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

  1. int cmp(const void *a,const void *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.      else if( !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; else return -1;  
  11. }  

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

 

大家自己先做下,不要搜代码

 

NYOJ  7(街区最短路经)

 

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

int x[101],y[101];

int x2[101],y2[101];

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

{

    return *(int *)a-*(int *)b;

}

int main()

{

    int N;

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

    {

        while(N--)

        {

            int i,n,sum=0;

            scanf("%d",&n);

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

            {

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

                x2[i]=x[i];

                y2[i]=y[i];

            }

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

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

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

            {

                if((x2[n/2]==x[i])&&(y2[n/2]==y[i]))

                {

                    continue;

                }

                sum+=abs(x[i]-x2[n/2])+abs(y[i]-y2[n/2]);

            }

            printf("%d\n",sum);

        }

    }

    return 0;

}

 

 

NYOJ 540(奇怪的排序)       来自第五届省赛,简单题

#include<stdio.h>

#include<stdlib.h>

typedef struct Node

{

    int mmm;//  数本身

    int mm;//   反序后的数

 

}Node;

Node node[55];

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

{

    Node *c = (Node *)a;

    Node *d = (Node *)b;

   

    return c->mm - d->mm;

}

int main()

{

    int N,m,n,i,x,k;

    scanf("%d",&N);

    while(N--)

    {

        x=0;

        scanf("%d %d",&m,&n);

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

        {

            x++;

            k=i;

            node[x].mmm=i;

            node[x].mm=0;

            while(k)

            {

               node[x].mm=node[x].mm*10+k%10;

               k=k/10;

            }

        }

        qsort(node+1,n-m+1,sizeof(node[1]),cmp);

        printf("%d",node[1].mmm);

        for(i=2;i<=n-m+1;i++)        {

            printf(" %d",node[i].mmm);

        }

         printf("\n");

    }

    return 0;

}

 

 

import java.util.Arrays;

import java.util.Scanner;

 

public class NYOJ540 {

 

    public static void main(String[] args) {

       int from, to, T;

       Node node[];

       Scanner sc = new Scanner(System.in);

       T = sc.nextInt();

       int temp;

       while(T-->0) {

           from = sc.nextInt();

           to = sc.nextInt();

           node = new Node[to-from+1];

           int j = 0;

           for(int i=0; i<node.length; i++) {

              //q已经初始化为0了

              node[i] = new Node();

           }

           for(int i=from; i<=to; i++) {

              node[j].p = i;

              temp = i;

              while(temp>0) {

                  /*

                   * 必须在大while循环构造node数组

                   * 否则就第一组数据正确

                   * 因为下面这一句用到了以前的q值

                   */

                  node[j].q = node[j].q*10 + temp%10;

                  temp /= 10;

              }

              j++;

           }

           /*

            * 只看API函数,第三个参数是toIndex,以为是下标

            * 谁知道具体一看不包括,wa了n次

            */

           Arrays.sort(node,0,to-from+1);

           System.out.print(node[0].p);

           for(int i=1; i<to-from; i++) {

              System.out.print(" "+node[i].p);

           }

           System.out.println(" "+node[to-from].p);

       }

    }

}

 

class Node implements Comparable<Node>{

    int p;

    int q;

   

    public Node() {

       this.p = 0;

       this.q = 0;

    }

 

    @Override

    public int compareTo(Node o) {

       // TODO Auto-generated method stub

       Node other = o;

       return this.q - other.q;

    }

   

   

}

posted @ 2013-08-05 10:46  hpu张亚飞  阅读(321)  评论(2编辑  收藏  举报