C语言库函数中qsort()的用法

 更新时间:2021年12月24日 09:12:57   作者:小小蔡很菜  
大家好,本篇文章主要讲的是C语言库函数中qsort()的用法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览

qsort是库函数提供的一种排序方法,我们就简单1了解一下怎么去用,而不去深究它的库函数是怎么写的

qsort是库函数中提供的一种能排序任何类型的数据的一种排序方法,思想是quick sort(快速排序),今天我听鹏哥讲指针,刚好引入了这一点,我就趁热打铁,总结一下该排序的用法

(一)void*  的指针类型是什么?

void*类型的指针是能接受任何数据类型的地址,但是void*的指针类型是不能进行解引用操作的,也不能进行加减整数的操作,因为void*不知道它会占用多少个字节

#include <stdio.h>
int main()
{
int a=10;
char ch='w';
void* p=&a;
p=&ch;
return 0;
}

(二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数?

我们先来看看qsort()内部有些什么参数,参数类型是什么,该怎么用。

void qsort(void* base, size_t, size_t, int ( * )(const void * ,  const void *  ))

可以看出共有四个参数

1.void1* base:待排序数组的首地址,可直接输入待排序数组名,也可使用指针指向该数组

2.size_t num:数组的长度,假如有数组int arr[ ]用sz=sizeof(arr)/sizeof(arr[0])来计算数组的长度

3.size_t width:数组中的元素所占字节,可用sizeof(arr[0])来计算单个元素的字节数

4.

int (*cmp)(const void* e1,const void* e2)
{
return  *(int*)e1 - *(int*)e2;//因为void*类型的指针不能进行加减操作,所以先将e1,e2进行强制类型转换,转为int*,然后对其进行解引用
//不同的情形可以根据不同的比较方式来写入这个函数
//例如,字符串进行比较的时候,可以引用strcmp()这个函数
}

:从这个形式可看出这是一个函数指针类型的参数,意味着将要调用一个函数,而这个函数在库函数中表示进行排序的方式

这里简单解释一下这个函数指针的意义

int 表示返回的是一个int类型的值

cmp表示函数名,*cmp表示指向这个函数

(const void* e1,const void* e2)这里·的e1,e2表示将要进行比较的两个元素,然后将两个元素的地址传到函数里,const表示无法修改指针指向的值

(三)使用qsort()来排序不同类型的数据

1.整型

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	int arr[10] = { 3,4,1,2,7,8,9,5,6,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
 
	return 0;
}

2.浮点型

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
int cmp_float(const void* e1, const void* e2)
{
	return (int)(*(int*)e1 - *(int*)e2);
    
}
int main()
{
	float arr[6] = { 2.0,2.3,4.5,5.0,8.0,9.0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_float);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%.2f ", arr[i]);
	}
	return 0;
}

3.结构体数据类型(数字,字符串)

下面我创建了一个机构体,我先以结构体中年龄排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
 
struct stu
{
	char name[20];
	int age;
	char sex[10];
};
int cmp_stu_by_age(const void* e1, const void* e2)//按年龄排序
{
	return ((struct stu*)e1)->age- ((struct stu*)e2)->age;
}
int main()
{
	struct stu s[3] = { {"zhangsan",30,"man"},{"lisi",20,"man"},{"ruhua",18,"woman"}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d %s\n", s[i].name, s[i].age, s[i].sex);
	}
	return 0;
}

 然后以姓名排序

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stu
{
	char name[20];
	int age;
	char sex[10];
};
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
}
 
//int cmp_stu_by_age(const void* e1, const void* e2)
//{
//	return ((struct stu*)e1)->age- ((struct stu*)e2)->age;
//}
int main()
{
	struct stu s[3] = { {"zhangsan",30,"man"},{"lisi",20,"man"},{"ruhua",18,"woman"}};
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
	int i;
	for (i = 0; i < sz; i++)
	{
		printf("%s %d %s\n", s[i].name, s[i].age, s[i].sex);
	}
	return 0;
}

 总结:

今天的qsort就这样了,关键在于

int cmp_int(const void* e1, const void* e2)
{
return *(int*)e1 - *(int*)e2;
}这一部分的书写与理解,然后就是孰能生巧,多练习就会知道怎么用了

到此这篇关于C语言库函数中qsort()的用法的文章就介绍到这了,更多相关C语言qsort()内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c语言实现的带通配符匹配算法

    c语言实现的带通配符匹配算法

    这篇文章主要介绍了c语言实现的带通配符匹配算法,需要的朋友可以参考下
    2015-03-03
  • C语言 表、栈和队列详解及实例代码

    C语言 表、栈和队列详解及实例代码

    这篇文章主要介绍了C语言 表、栈和队列详解及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java C++题解 leetcode第k个数实例

    Java C++题解 leetcode第k个数实例

    这篇文章主要为大家介绍了Java C++题解 leetcode第k个数实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • C语言深入详解四大内存函数的使用

    C语言深入详解四大内存函数的使用

    这篇文章主要介绍了C语言的四大内存函数,讲解了mencpy、memmove、memcmp、memset函数,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-07-07
  • C语言通过案例讲解并发编程模型

    C语言通过案例讲解并发编程模型

    所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生,下面我们根据样例来理解
    2022-04-04
  • C语言学习之关键字的示例详解

    C语言学习之关键字的示例详解

    关键字,这名字一听,就很关键。而有些关键字,你可能不是很了解,更别谈使用。所以,这篇文章将带你见识常见的关键字,一起领略它们的风采吧
    2022-10-10
  • C++中virtual继承的深入理解

    C++中virtual继承的深入理解

    本篇文章是对C++中的virtual继承进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C C++输入输出基础教程示例详解

    C C++输入输出基础教程示例详解

    当我们在网站做题的时候经常会遇到各种要求的输入输出,而且会有时间超限等多个问题,这时我们就要优化我们的输入输出或者规范我们的输入输出格式,下面介绍C和C++中的输入输出问题,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2023-11-11
  • Qt 实现桌面雪花飘落代码

    Qt 实现桌面雪花飘落代码

    这篇文章主要介绍了Qt实现桌面雪花飘落代码,有需要的朋友可以参考一下
    2013-12-12
  • 浅析iterator与指针的区别

    浅析iterator与指针的区别

    指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离
    2013-10-10

最新评论