【qsort】各种用法--原创(c)

                                                                     qsort--快排                                                                 

           用错了N久  wr的不行。。。最后换成sortA了。。。

基本:头文件<stdlib.h>

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

s-数组名

n-需要排序的个数

sizeof(s[0])-每个数据所占内存

cmp-判断函数

整数数组排序:

#include <stdio.h>
#include <stdlib.h>

int cmp ( const void *a , const void *b ) 
{ 
return *(int *)a > *(int *)b; 
} 

int main()
{
    int a[5]={3,6,1,4,8},i;
    qsort(a,5,sizeof(a[0]),cmp);
    for(i=0;i<5;i++)
    printf("%d  ",a[i]);
}

//这是从小到大排序--改变cmp里的符号(‘>’--从小到大||'<'--从大到小)

char类型数组排序:

#include <stdio.h>
#include <stdlib.h>

int cmp ( const void *a , const void *b ) 
{ 
return *(char *)a > *(char *)b; 
} 

int main()
{
    char a[5]={'3','6','1','4','8'},i;
    qsort(a,5,sizeof(a[0]),cmp);
    for(i=0;i<5;i++)
        printf("%c  ",a[i]);
}

//和int一样  只是改变cmp里的数据类型

double型 据说需要x>y?1:-1;虽然不知道为啥:

#include <stdio.h>
#include <stdlib.h>

int cmp ( const void *a , const void *b ) 
{ 
    return *(double *)a > *(double *)b ? 1 : -1; 
} 

int main()
{
    double a[5]={3.3,6.1,1.4,4.3,8.2};
    int i;
    qsort(a,5,sizeof(a[0]),cmp);
    for(i=0;i<5;i++)
        printf("%.2lf   ",a[i]);
}


结构体排序:

#include <stdio.h>
#include <stdlib.h>

typedef struct In    //注意typedef
{
    int a;
    double b;
}lim;

int cmp ( const void *p , const void *q ) 
{ 
    const lim * n = (const lim *)p;
    const lim * m = (const lim *)q;
    if(n->a > m->a )      //判断大小顺序
        return 1;
    else if(n->a < m->a)
        return -1;
    else
        return 0;
} 

int main()
{
    int a[5]={3,6,1,4,8};
    int i;
    lim s[5];
    for(i=0;i<5;i++)
        s[i].a=a[i];
    qsort(s,5,sizeof(s[0]),cmp);
    for(i=0;i<5;i++)
        printf("%d   ",s[i].a);
}

结构体里数组排序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct  
{ 
int data; 
char str[100]; 
}lim;

int cmp ( const void *a , const void *b ) 
{ 
    const lim * n = (const lim *)a;
    const lim * m = (const lim *)b;
    return strcmp(m->str , n->str ); //改变这个位置 改变排序方向
} 

int main()
{
    int a[5]={3,6,1,4,8};
    int i;
    lim s[5];
    printf("输入3个字符串:
");
    for(i=0;i<3;i++)
        gets(s[i].str);
    qsort(s,3,sizeof(s[0]),cmp);
    for(i=0;i<3;i++)
        puts(s[i].str);
}

//看不懂下面的

七、计算几何中求凸包的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;
}
原文地址:https://www.cnblogs.com/zhangfengnick/p/4925884.html