大家好,本篇文章主要讲的是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;
/
本文标题为:C语言库函数中qsort()的用法
基础教程推荐
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17