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

目录
  • (一)void*  的指针类型是什么?
  • (二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数?
  • (三)使用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()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 一篇文章教你自己动手实现C语言库函数

    目录 memmove 函数声明 函数作用 实现memmove memcpy 函数声明 函数作用 实现memcpy strstr 函数声明 函数作用 实现strstr strcat 函数声明 函数作用 实现strcat strcmp 函数声明 函数作用 实现strcmp strcpy 函数声明 函数作用 实现strcpy strlen 函数声明 函数作用 实现strlen 总结 memmove 函数声明 void * memmove ( void * destination, const void

  • c语言快速排序算法示例代码分享

    步骤为:1.从数列中挑出一个元素,称为 "基准"(pivot);2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区退出之后,该基准就处于数列的中间位置.这个称为分区(partition)操作.3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序.递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了.虽然一直递归下去,但是这个算法总会退出,因为在每次的迭代(iterat

  • C语言中使用快速排序算法对元素排序的实例详解

    调用C语言的快速排序算法qsort(); #include<stdio.h> #include<stdlib.h> #include<string.h> #define SIZE 100 //从小到大排序 int comp1(const void *x,const void *y) { return *(int *)x - *(int *)y; } //从大到小排序 int comp2(const void *x,const void *y) { return *(in

  • C语言库函数qsort及bsearch快速排序算法使用解析

    目录 qsort 含义 实现 格局打开 bsearch qsort qsrot 就是C语言库函数中的快速排序函数,对数组,结构体都可以实现快速排序, 他在头文件<stdlib.h>中使用,声明格式为: void qsort(void* base, size_t nums, size_t size, int (*compare)(const void *, const void*)) 这么烦人一长串的参数各是什么意思呢,base 是指向要排序的数组的第一个元素的指针.nums是由 base 指向

  • C语言实现快速排序算法

    一.快速排序算法(Quicksort) 1. 定义 快速排序由C. A. R. Hoare在1962年提出.快速排序是对冒泡排序的一种改进,采用了一种分治的策略. 2. 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 3. 步骤 a. 先从数列中取出一个数作为基准数. b. 分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

  • C语言中qsort函数的用法实例详解

    C语言中qsort函数的用法实例详解 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法. qsort函数包含在<stdlib.h>中 qsort函数声明如下: void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *)); 参数说明: base,要排序的数组 nmemb,数组中元素的数目 size,每个数组元素占用的内存空间,可使用si

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

    目录 (一)void*  的指针类型是什么? (二)void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))  该怎么使用该库函数? (三)使用qsort()来排序不同类型的数据  总结: qsort是库函数提供的一种排序方法,我们就简单1了解一下怎么去用,而不去深究它的库函数是怎么写的 qsort是库函数中提供的一种能排序任何类型的数据的一种排序方法,思想是quick sort(快速排序),今天我听

  • C语言库函数qsort的使用详解

    目录 一.回调函数 二.库函数qsort 三.使用qsort排序整型数组 四.使用qsort排序结构体 1.使用qsort排序结构体中的字符成员 2.使用qsort排序结构体中的整型成员 五.基于冒泡排序的库函数qsort的模拟实现 1.使用改写函数排序整型数组 2.使用改写函数排序结构体中的字符成员 3.对库函数qsort的总结 六.力扣977#中库函数qsort的使用 一.回调函数 C语言库函数中的qsort的是一个回调函数,回调函数就是一个通过函数指针调用的函数.如果把函数的指针(地址)作

  • 浅谈c语言中转义字符的用法及注意事项

    c语言中的转义字符: \a 响铃符 \b 退格 \f 换页符 \n 换行符 \r 回车符(回到该行的首位置) \v 纵向制表符 \\ 反斜杠 \? 问号(?经vs10测试可以直接打印) \"(\') 双引号(单引号) \ooo 八进制数(ooo表示一个用8进制数表示出来的对应ANSII代码对应出字符,用此方法可以表示出所有ASCII字符.不过测试发现打不出%号,存疑!) \xhh 十六进制数(功能同八进制数,用hh表示一个十六进制数,如\x20表示空格) 注:使用转义字符的退格符,换行符,回车符

  • C语言与C++中const的用法对比

    目录 一.C语言中的const 二.C++中的const 三.进一步比较C和C++中的const 四.const与宏的区别 五.小结 一.C语言中的const const修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const修饰的全局变量在只读存储区分配空间 const只在编译期有用,在运行期无用 C语言中的const使得变量具有只读属性 const将具有全局生命周期的变量存储于只读存储区 const修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号

  • C语言库函数qsort的使用及模拟实现

    目录 1.qsort函数的介绍 2.qsort实现不同类型数据排序 3.qsort的模拟实现 1.qsort函数的介绍  函数定义: 函数参数 : void* base 待排序的数据的起始位置 size_t num 待排序的数据元素的个数 size_t width 待排序的数据元素的大小,以字节为单位 int (*compar)(const void*,const void*) 是一个函数指针,函数功能是比较 因该排序算法要排序的数据的类型是不同的,比较方法也是有差异的,因此要给使用者提供一个自

  • C语言库函数getchar()新见解

    目录 getchar()的描述以及用法 案例 图文解释 总结 getchar()的描述以及用法 getchar()是stdio.h中的库函数,它的作用是从缓冲区中读取一个字符,如果缓冲区中没有字符可供读取,它就会等待终端键盘输入字符,按回车键表示输入结束. * 回车键也算一个字符,放在缓冲区中(后面会在VS调试监视出给大家看)* 下面是 getchar() 函数的声明: int getchar(void) 该函数的返回类型是int类型,返回值是用户输入字符的ASCII码值. 案例 基础的例子就不

  • C语言指针详解及用法示例

    新手在C语言的学习过程中遇到的最头疼的知识点应该就是指针了,指针在C语言中有非常大的用处.下面我就带着问题来写下我对于指针的一些理解. 指针是什么? 指针本身是一个变量,它存储的是数据在内存中的地址而不是数据本身的值.它的定义如下: int a=10,*p; p=&a int a=10; int *p=&a; 首先我们可以理解 int* 这个是要定义一个指针p,然后因为这个指针存储的是地址所以要对a取地址(&)将值赋给指针p,也就是说这个指针p指向a. 很多新手都会对这两种定义方法

  • C#中HttpWebRequest的用法详解

    本文实例讲述了C#中HttpWebRequest的用法.分享给大家供大家参考.具体如下: HttpWebRequest类主要利用HTTP 协议和服务器交互,通常是通过 GET 和 POST 两种方式来对数据进行获取和提交.下面对这两种方式进行一下说明: GET 方式: GET 方式通过在网络地址附加参数来完成数据的提交,比如在地址 http://www.jb51.net/?hl=zh-CN 中,前面部分 http://www.jb51.net表示数据提交的网址,后面部分 hl=zh-CN 表示附

  • Python3.2中Print函数用法实例详解

    本文实例讲述了Python3.2中Print函数用法.分享给大家供大家参考.具体分析如下: 1. 输出字符串 >>> strHello = 'Hello World' >>> print (strHello) Hello World 2. 格式化输出整数 支持参数格式化,与C语言的printf类似 >>> strHello = "the length of (%s) is %d" %('Hello World',len('Hello

随机推荐