C语言库函数---qsort

文章目录

头文件

<stdlib.h>

函数声明

void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));

参数声明

base: 要排序的数组
nmemb: 数组中的元素数目
size: 每个数组元素占用内存空间,可使用sizeof获得
compar: 比较两个数组元素的比较函数。本比较函数的第一个参数值小于、等于、大于第二参数值时,本比较函数的返回值应分别小于、等于、大于零。

也就说你要实现一个这样的函数(升序):
int cmp(const void *a, const void *b)
如果a > b,返回>0
如果a == b, 返回0
如果a < b,返回<0
这里的a和b的关系仅仅是逻辑上的,并不是值比较,所以排序的可以不仅仅是数字,还可以是字符。

一些常用例子

1、对一维数组进行排序

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

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

int main()
{
   int array[20] = {0};
   //生成一个随机一维数组
   int i = 0;
   for (i=0;i<20;i++){
       array[i] = rand()%20;
   }
   
   for (i=0;i<20;i++){
       printf("%d\n",array[i]);
   }
   
   qsort(array,20,sizeof(int),cmp);
   printf("sort result:\n");
   for (i=0;i<20;i++){
       printf("%d\n",array[i]);
   }
   return 0;
}

2、对二维数组进行排序

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

int comp(const void *a,const void *b){
     return ((int *)a)[0]-((int *)b)[0];
}

int main()
{
    int array[20][5] = {{0}};
    //生成一个随机二维数组
    int i = 0,j = 0;
    for (i=0;i<20;i++){
        for (j=0;j<5;j++){
            array[i][j] = rand()%20;
        }
    }
    
    for (i=0;i<20;i++){
        for (j=0;j<5;j++){
            printf("%-5d",array[i][j]);
        }
        printf("\n");
    }

    qsort(array,20,sizeof(int)*5,comp);    
    printf("sort result:\n");
    for (i=0;i<20;i++){
        for (j=0;j<5;j++){
            printf("%-5d",array[i][j]);
        }
        printf("\n");
    }    
    return 0;
}

3、对char类型数组进行排序

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

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

int main()
{
    char word[30] = {0};
    
    sprintf(word,"%s","happy");
    printf("%s\n",word);
    
    qsort(word,5,sizeof(char),cmp);    
    printf("%s\n",word);
    
    return 0;
}

4、对double类型数组排序

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

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

int main()
{
    int i = 0;
    double num[20] = {0};
    
    /*生成0-20的随机小数*/
    for (i=0; i<20; i++){
        num[i] = (double)(rand()%20) * (double)(rand()%20)/(double)20;
    }
    
    for (i=0; i<20; i++){
        printf("%.2f\n",num[i]);
    }
    printf("sort result:\n");
    qsort(num,20,sizeof(num[0]),cmp);
    for (i=0; i<20; i++){
        printf("%.2f\n",num[i]);
    }    
    
    return 0;
}

5、对结构体一级排序

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

struct NUMBER{
  int data;
  char *other;  
}num[20];

int cmp( const void *a , const void *b){
        return (*(struct NUMBER *)a).data > (*(struct NUMBER *)b).data ? 1:-1;
}

int main()
{
    int i = 0;
    
    /*生成0-20的随机小数*/
    for (i=0; i<10; i++){
        num[i].data = rand()%10;
    }
    
    for (i=0; i<10; i++){
        printf("%d\n",num[i].data);
    }
   
    printf("sort result:\n");
    qsort(num,10,sizeof(num[0]),cmp);
    for (i=0; i<10; i++){
        printf("%d\n",num[i].data);
    }    
 
    return 0;
}

6、对结构体二级排序

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

7、对字符串进行排序

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

struct NUMBER{
  char str[100];
  char *other;  
}num[5];

int cmp( const void *a , const void *b){
        return strcmp((*(struct NUMBER*)a).str,(*(struct NUMBER*)b).str);
}

int main()
{
    int i = 0;

    /*生成20个字符串*/
    strcpy(num[0].str,"aaa");
    strcpy(num[1].str,"bbb");
    strcpy(num[2].str,"ccc");
    strcpy(num[3].str,"aaa");
    strcpy(num[4].str,"ccc");
    
    for (i=0; i<5; i++){
        printf("%s\n",num[i].str);
    }
   
    printf("sort result:\n");
    qsort(num,5,sizeof(num[0]),cmp);
    for (i=0; i<5; i++){
        printf("%s\n",num[i].str);
    }    
 
    return 0;
}
C语言库函数---qsortC语言库函数---qsort 学无止境966 发布了174 篇原创文章 · 获赞 6 · 访问量 7525 私信 关注
上一篇:c语言的库函数之快排


下一篇:c语言 qsort排序