qsort与sort 排序

qsort采用快速排序的方法进行排序,存在于头文件<stdlib.h>中,其原型为:

void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

利用其排序关键在于写出数据比较的方法,即函数cmp()

1、对整型数据排序

int num[100];
int cmp(const void*a,const void*b)
{
   return *(int *)a-*(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);

2、对字符型数据排序

char word[100];
int cmp(const void*a,const void*b)
{
	return *(char *)a-*(char *)b;
}
qsort(word,100,sizeof(word[0]),cmp);

3、对浮点型数据排序

double real[100];
int cmp(const void*a,const void*b)
{
	return *(double *)a>*(double *)b?1:-1;
}
qsort(real,100,sizeof(real[0]),cmp);

直接返回两数之差可能由于返回类型为int导致数据出错。

4、对字符串类型排序

char str[100][100];
int cmp(const void*a,const void*b)
{
	return strcmp((char *)a,(char *)b);
}
qsort(str,n,sizeof(str[0]),cmp);

5、对结构体变量进行排序(根据结构体内成员变量大小进行)

struct student
{
	int ID;
	double score;
}std[100];
int cmp(const void*a,const void*b)
{
	return (*(student*)a).score>(*(student*)b).score?1:-1;
}
qsort(std,100,sizeof(std[0]),cmp);

struct point
{
	int x;
	int y;
}p[100];
int cmp(const void*a,const void*b)
{
	struct point *p1=(point *)a;
	struct point *p2=(point *)b;
	if(p1->x!=p2->x)
		return p1->x-p2->x;
	else
		return p1->y-p2->y;
}
qsort(p,100,sizeof(p[0]),cmp);

struct student
{
	int ID;
	char name[100];
}std[100];
int cmp(const void*a,const void*b)
{
	return strcmp((*(student *)a)->name,(*(student *)b)->name);
}
qsort(std,100,sizeof(std[0]),cmp);

与qsort相比较,sort则比较简单,对一般的内置类型而言,不需要编写cmp()函数即可。对结构体变量进行排序时,需要编写相应的比较函数,或者直接在结构体内写关系运算符的重载函数即可。

bool operator==(const student &std1,const student &std2)
{
	return std1.ID==std2.ID&&std1.name==std2.name&&std1.adress==std2.adress;
}

bool operator!=(const student &std1,const student &std2)
{
	return std1==std2;
}

bool operator<(const student &std1,const student &std2)
{
	return std1.ID<std2.ID;
}

bool operator>(const student &std1,const student &std2)
{
	return std1.ID>std2.ID;
}

bool operator<(const student &std)const
{
	return score<std.score
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值