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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值