qsort用法

来源:互联网 发布:mac脚本编辑器怎么用 编辑:程序博客网 时间:2024/05/19 17:47

对其的说明:

qsort,包含在stdlib.h文件里,函数一共有四个参数,没有返回值,函数原型为:CRTIMP void __cdecl qsort(void*, size_t, size_t,
int (*)(const void*, const void*)),形象的说一个典型的用法为:qsort(s,n,sizeof(s[0]),cmp);

第一个参数是参与排序的数组名第二个是参与排序的元素个数,第三个是单个元素的大小,第四个参数有点麻烦是一个指向函数的指针,由于函数名本身代表一个地址,因此在使用时可直接将第四个参数写成函数名,下面通过例子对其进行说明。

1、最常见的,对int数组进行排序

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

int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int main()
{
    int s[10];
    int i;
    for(i=0;i<10;i++)
        s[i]=9-i;
    qsort(s,10,sizeof(s[0]),cmp);
    for(i=0;i<10;i++)
        printf("%d ",s[i]);
    printf("/n");
    return 0;
}

2、对double型数组进行排序

注意cmp函数因为double数是不可相等的,所以在判断时返回里只用了1和-1

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

double s[1000];
int i,n;

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

int main()
{
    scanf("%d",&n);
    for(i=0;i<n;i++)scanf("%lf",&s[i]);
    
    qsort(s,n,sizeof(s[0]),cmp);
    
    for(i=0;i<n;i++) printf("%lf ",s[i]);
    
    return(0);
}

3、对字符串数组排序(char s[][])

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

char s[100][100];
int i,n;

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

int main()
{
    scanf("%d",&n);
    for(i=0;i<n;i++) scanf("%s",s[i]);

    
    qsort(s,n,sizeof(s[0]),cmp);
    
    for(i=0;i<n;i++) printf("%s/n",s[i]);
    
    return(0);
}

4、对char型指针数组排序

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

char *s[100];
int i,n;

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

{
    return(strcmp(*(char**)a,*(char**)b));
}

int main()
{
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        s[i]=(char*)malloc(sizeof(char*));
        scanf("%s",s[i]);
    }

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

    for(i=0;i<n;i++) printf("%s/n",s[i]);

    return(0);
}

说明:

快速排序是不稳定的,因此在对有相同元素的数据进行排序时将会产生影响,最常见的例子是结构体排序,对于这种情况可在cmp函数作作手脚,使其变的稳定,代码如下

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

struct node
{
    double date1;
    int no;
} s[100];

int i,n;

int cmp(const void *a,const void *b)
{
    struct node *aa=(node *)a;
    struct node *bb=(node *)b;
    if(aa->date1!=bb->date1)
        return(((aa->date1)>(bb->date1))?1:-1);
    else
        return((aa->no)-(bb->no));
}

int main()
{
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        s[i].no=i+1;
        scanf("%lf",&s[i].date1);
    }
    qsort(s,n,sizeof(s[0]),cmp);

    for(i=0;i<n;i++)printf("%d  %lf/n",s[i].no,s[i].date1);

    return(0);
}


原创粉丝点击