很多初学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);