qsort函数的cmp
在常用算法总排序是最常用的算法之一!而快排在c 的stdlib库中是有现成的封装对于我们写算法是提供了方便之处的!
一、对int类型数组排序
int cm p ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}
qsort(arry, N, sizeof(arry[0]), c m p);
qsort(指向一个要排序数组的首地址
, 指要排序数组的元素个数
, 指每个元素的大小
, cmp);
这个是一个从大到小的排序如果要从小到大排序可以讲c mp函数改为如下:
int cm p(constvoid *a,constvoid *b)
{
return*(int *)a - *(int *)b;
}
二、对char类型数组排序(同int类型)
char word[100];
int cm p( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}
qsort(word,100,sizeof(word[0]),cmp);
sizeof结构体大小三、对double类型数组排序
double in[100];
int cm p( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}
qsort(in,100,sizeof(in[0]),c m p);
四、对结构体一级排序
struct Sample
{
double data;
int other;
}s[100]
//按照data的值从小到大将结构体排序
int cm p( const void *a ,const void *b)
{
return (*(Sample *)a).data > (*(Sample *)b).data ? 1 : -1; }
qsort(s,100,sizeof(s[0]),c mp);
五、对结构体二级排序
struct Sample
{
int x;
int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cm p( const void *a , const void *b )
{
struct Sample *c = (Sample *)a;
struct Sample *d = (Sample *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}
qsort(s,100,sizeof(s[0]),c mp);
六、对字符串进行排序
struct Sample
{
int data;
char str[100];
}s[100];
//按照结构体中字符串str的字典顺序排序
int cm p ( const void *a , const void *b )
{
return strc m p( (*(Sample *)a)->str , (*(Sam ple *)b)->str ); }
qsort(s,100,sizeof(s[0]),c mp);
上一篇讲了快速排序的实现。但在很多场合,直接使用快速排序的库函数是很方便的。下面讲下VC中库函数qsort()的用法:
函数原型:
void qsort(void *base,size_t num,size_t width, int (__cdecl
*compare )(const void *, const void *) );
第一个是数组地址,第二是数组大小,第三个是数组中每个元素的字节数,最后一个是个函数指针,表示如何比较数组中的元素。
头文件#include <stdlib.h>
下面分别就int等整数数据,double等浮点数据,结构体和类,按指定方式这四种情况进行讲解。
实例1 对int等整数数据进行排序
[cpp]view plainc opy
1.int cmp(const void *x, const void *y)
2.{
4.}
5.qsort(a, MAXN, sizeof(a[0]), cmp);
MAXN为数组大小,下同
实例2 对double等浮点数进行排序
[cpp]view plainc opy
1.int cmpDouble(const void *x, const void *y)
2.{
4.}
5.qsort(a, n, sizeof(a[0]), cmpDouble);
实例3 对结构体,类等复杂数据进行排序
如
[cpp]view plainc opy
1.struct Student
2.{
3.char szName[30];
4.int nAge;
5.};
先对年龄排序,年龄相同再按姓名排序。
[cpp]view plainc opy
1.int cmpStudent (const void *x, const void *y)
2.{ //先作下指针转换,再按要求比较
3.Student *pNodex = (Student*)x, *pNodey = (Student*)y;
4.if (pNodex->nAge != pNodey->nAge)
6.else
8.}
9.qsort(a, n, sizeof(a[0]), cmpStudent);
实例4 按指定方式进行排序。
如对只有大小写字母的字符串"AajkuKdYUBCDwyz"进行排序,要求大写字母在前,小写字母在后。
[cpp]view plainc opy
1.int cmp1(const void *x, const void *y)
2.{
3.char *pcx = (char*)x, *pcy = (char*)y;
4.
5.bool flag1 = *pcx >= 'A' && *pcx <= 'Z';
6.bool flag2 = *pcy >= 'A' && *pcy <= 'Z';
7.
8.if(flag1 == flag2) //如果都为大写字母或都为小写字母
10.else //否则,谁为大写字母,谁的权值小。
12.}
13.int main()
14.{
15.char szText[] = "AajkuKdYUBCDwyz";
16.qsort(szText, strlen(szText), sizeof(szText[0]), cmp1);
17.printf("%s\n", szText);
19.}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论