qsort函数排序举例

使用qsort函数快速排序应用举例

这篇博客是用qsort函数来快速排列float型数据,分别按照年龄(int型)、姓名(char型)排列结构体。看懂就看懂,看不懂我也不想解释了。

简略解释一下qsort函数:

void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );

以下内容来自MSDN:

Return Value
None

Parameters
base

Start of target array
num

Array size in elements
width

Element size in bytes
compare

Comparison function
elem1
Pointer to the key for the search

elem2
Pointer to the array element to be compared with the key
博主水平有限,想知道qsort函数具体怎么用的自己百度吧。

直接上代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp_float(const void* e1, const void* e2)
{
	//return (int)*(float*)e1 - *(float*)e2;
	//qsort函数的最后一个参数需要一个返回整型,而这里返回的是一个实型,写成下面的代码会更好:
	if (*(float*)e1 == *(float*)e2)
		return 0;
	else if (*(float*)e1 < *(float*)e2)
		return -1;
	else
		return 1;
}
void text_float()
{
	float f[] = { 1.5,19.0,2.4,8.3,0.8,0.9 };
	int sz = sizeof(f) / sizeof(f[0]);
	qsort(f, sz, sizeof(f[1]), cmp_float);
	for (int i = 0; i < sz; i++)
		printf("%f\n", f[i]);
}

//以下是结构体排序:
struct Stu
{
	char name[20];
	int age;
};


int cmp_struct_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
int cmp_struct_by_name(const void* e1, const void* e2)
{
    //字符比较大小要用<string.h>文件夹下的strcmp()函数
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}


void text_struct()
{
	
	struct Stu s[] = { {"张三",20},{"李四",30},{"王五",10} };
	int sz = sizeof(s) / sizeof(s[1]);
	qsort(s, sz, sizeof(s[1]), cmp_struct_by_age);
	printf("姓名\t年龄\n");
	for (int i = 0; i < sz; i++)
		printf("%s\t%d\n", s[i].name,s[i].age);
}
void text_name()
{
	struct Stu s[] = { {"张三",20},{"李四",30},{"王五",10} };
	int sz = sizeof(s) / sizeof(s[1]);
	qsort(s, sz, sizeof(s[1]), cmp_struct_by_name);
	printf("姓名\t年龄\n");
	for (int i = 0; i < sz; i++)
		printf("%s\t%d\n", s[i].name, s[i].age);
}


int main()
{
	text_float();//按照升序排列float型数据
	text_struct();//按照年龄升序排列结构体
	text_name();//按照姓名排列结构体
	return 0;
}
最后附上运行结果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值