C语言中qsort函数用法详解

时间:2021-10-01 15:46:17

       多初学C语言的人一般来说都会接触到排序算法,冒泡排序啦,选择排序啦,快排啦,这其中最好用最简明的就是快排,大多数C语言初学者对于这些排序算法一般采用手写,但是手写会浪费大量的时间而且可能会写错,C语言中其实已经将快排函数给我们封装了成一个库函数供我们使用,就不用我们自己写了,该库函数的名字为qsort包含在<stdlib.h>的头文件下,函数原型为:

     void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

   这里显而易见的是这个函数有4个参数,其实这4个函数也比较明确。

   1.第一个是一个指针,也就是说你要排序的那个数组的地址。

   2.第二个是你要对这个数组排序的数量,是从数组的第一个位置开始的到这个数量的位置。

   3.第三个是你排序的这个数组中每一个成员所占的大小,用法很简单,这一给初学C语言的讲一下,这里需要调用一个C语言中的操作符来获取当前成员的大小,比如定义了一个int a[1000]的数组,获取其成员大小为sizeof(a[0])。

   4.这个参数就比较有意思了,你需要自己写一个比较函数来决定排序是升序还是降序排列,下面我就给出几乎是涵盖所有C语言中数据类型的排序的算法,默认给出的都是升序排序,降序排序参见注释。

   int类型

int num[100];

int cmp ( const void *a , const void *b )
{
return *(int *)a > *(int *)b ? 1 : -1;
//若是降序排序则
//return *(int *)b > *(int *)a ? 1 : -1;
}qsort(num,100,sizeof(num[0]),cmp);
   double类型

double in[100];

int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
//若是降序排序则
//return *(double *)b > *(double *)a ? 1 : -1;
}qsort(in,100,sizeof(in[0]),cmp);

   char类型

char word[100];

int cmp( const void *a , const void *b )
{
return *(char *)a - *(char *)b;
//若是降序排序则
//return *(char *)b - *(char *)a;

}

qsort(word,100,sizeof(word[0]),cmp);

   结构体类型,这个类型其实就比较有意思了,有一种简单和和一种复杂的,下面先说简单的,就是按照你想排的那个数据进行排序,对于结构体中的其他数据都是随机排序的。

struct test
{
double data;
int other;
}s[100]


int cmp( const void *a ,const void *b)
{
return (*(test *)a).data > (*(test *)b).data ? 1 : -1;
//若是降序排序则
//return (*(test *)a).date > (*( test *)b).date? 1: -1;}qsort(s,100,sizeof(s[0]),cmp);
    
    这个第二种相对来说就比第一种看起来复杂好多了,其实用法大致相同,只不过在你选定的那个数据相同时,可以根据其他数据排序,这里给出一个简单的例子

   

struct test
{
int x;
int y;
}s[100];

//按照x升序排序,当x相等时按照y降序

int cmp( const void *a , const void *b )
{
struct test *c = (test *)a;
struct test *d = (test *)b;
//这里不难看出,若是升序则c中数据-d中数据,降序反之if(c->x != d->x) return c->x - d->x;else return d->y - c->y;}qsort(s,100,sizeof(s[0]),cmp);

   字符串的排序
char s[5][5];
int cmp ( const void *a , const void *b )
{
//这是按照字典序进行排序return strcmp( (char *)a ,(char*) b );}qsort(s,5,5*sizeof(char),cmp);
    这里给出最后一种,也就是结构体里的字符串排序


struct test
{
int data;
char str[100];
}s[100];

//按照结构体中字符串str的字典顺序排序

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

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