C语言详细i讲解qsort函数的使用

目录
  • qsort
  • 1.int型
  • 2.float型
  • 3.struct型

qsort

  • 功能:Performs a quick sort.(快速排序)
  • 参数:void qsort( void *base, size_t num, size_t width, int (*cmp )(const void *e1, const void *e2 ) );
  • 头文件:#include <stdlib.h>

用法:

  • 第一个参数待排数组的首元素地址
  • 第二个参数待排数据个数
  • 第三个待排数据中每个参数的大小——单位是字节
  • 第四个编写一个函数来判断待排数据谁大谁小,其规定如下

void*类型的指针 可以接收任意类型的地址

void*类型的指针 不能进行解引用的操作(访问字节不确定)

void*类型的指针 不能进行加减整数的操作

下面我们先来看一下简单的运用及其结果

1.int型

#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] = { 9,8,7,6,5,4,3,2,1,0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    qsort(arr, sz, sizeof(arr[0]), cmp_int);
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}

看到这里,这是升序排列的,如果要降序的话,直接return*(int*)e2-*(int*)e1;

为了方便,我们把每种类型记住测试类型test,比如int型为test1,以此类推

2.float型

int cmp_float(const void* e1, const void* e2)
{
    return *(float*)e1 - *(float*)e2;
}
void test2()
{
    float f[] = { 9.0,8.0,7.0,5.0,4.0 };
    int sz = sizeof(f) / sizeof(f[0]);
    qsort(f, sz, sizeof(f[0]), cmp_float);
    int j = 0;
    for (j = 0; j < sz; j++)
    {
        printf("%f ", f[j]);
    }
}
int main()
{
test2();
return 0;
}

3.struct型

由于struct结构体的成员可能有许多的类型,我这里只举了比较简单的例子结构体成员只包含名字和年龄。用qsort按照年龄排序,按照名字排序

struct Stu
{
    char name[20];
    int age;
};

struct-age

int cmp_Stu_by_age(const void*e1,const void*e2)
{
    return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
void test3()
{
    struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",18} };
    int sz = (sizeof(s) / sizeof(s[0]));
    qsort(s, sz, sizeof(s[0]), cmp_Stu_by_age);
    int z = 0;
    for (z = 0; z < sz; z++)
    {
        printf("%s %d", s[z].name,s[z].age);
    }
}
int main()
{
test3();
return 0;
}

struct-name

int cmp_Stu_by_name(const void* e1, const void* e2)
{
    return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
void test4()
{
    struct Stu s[3] = { {"zhangsan",20},{"lisi",30},{"wangwu",18} };
    int sz = (sizeof(s) / sizeof(s[0]));
    qsort(s, sz, sizeof(s[0]), cmp_Stu_by_name);
    int z = 0;
    for (z = 0; z < sz; z++)
    {
        printf("%s %d", s[z].name,s[z].age);
    }
}
int main()
{
test 4();
return 0;
}

这里有一个需要注意的点,字符串比较要用strcmp函数来比较,不能直接去进行相减。

好啦,本次有关qsort函数到此结束啦,点个赞把。

到此这篇关于C语言详细i讲解qsort函数的使用的文章就介绍到这了,更多相关C语言qsort函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

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

  • 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函数的介绍与用法实例

    目录 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序: 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 总结 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参数说明: void qsort ( void

  • C语言中关于库函数 qsort 的模拟实现过程

    目录 前言 一.qsort函数 二.qsort函数实现思路 1. 底层原理 2. 函数传参 1). 第一个参数 2). 第二个参数 3). 第三个参数 4). 第四个参数 三.局部函数实现 四.全部代码汇集 五.总结 前言 我们在上一篇博客讲解了库函数qsort的使用,今天我为大家带来qsort的模拟实现.上一篇博客这个库函数的阅读链接:C语言中关于库函数 qsort 快排的用法 其实有人会问,我明明已经掌握了库函数qsort的使用方法,为何还要去写模拟实现,其实啊,学好一个东西,不仅仅只是会用

  • C语言之qsort函数详解

    目录 一.qsort函数原型 二.qsort常见的几种比较函数 1.int类型的排序 2.double类型的排序 3.char类型的排序 4.字符串的排序: 1.按首字母排序 2.按字符串长度排序: 总结 一.qsort函数原型 qsort 功 能: 使用快速排序例程进行排序,这个函数是根据二分法写的,其时间复杂度为n*log(n) #include<stdlib.h> void qsort(void *base, int nelem, int width, int (*fcmp)(const

  • C语言中关于库函数 qsort 快排的用法

    目录 前言 一.库函数(qsort)的含义 二.(qsort)函数的实现方式,话不多说,请看. 1. 第一个参数 2. 第二个参数 3. 第三个参数 4. 第四个参数 1). 函数的参数 2). 这第四个参数的重点 三.函数实现 四.总结 前言 我也只是一个奋斗的程序猿,仅以此篇文章,作为我学习的见证,可能我的文采不好,有时候讲的词不达意,但我尽力去做好我想做的这些事情,如果此篇文章能够给各位读者带来一定的认识,那自然是最好的.若文章中有鄙人讲错了的,欢迎评论区指点.谢谢!!! 一.库函数(qs

  • C语言 使用qsort函数来进行快速排序

    目录 前言 qsort的简单介绍 用qsort实现一个整形类型的排序 用qsort函数实现结构体的排序 qsort函数的实现 前言 今天分享一个库函数 介绍qsort的使用及实现方法 他可以实现不限于整形.浮点型.字符型.自定义等类型的排序 qsort的简单介绍   qsort 头文件 #include <stdlib.h> 格式 void qsort(void* base,size_t num,size_t width,int(__cdecl*compare(const void*,cons

  • 关于C语言qsort函数详解

    目录 C语言qsort函数详解 一.qsort函数是什么 二.使用qsort排序-以升序为例 1.整形数组排序 2.字符数组排序 3.字符指针数组排序 4.结构体数组排序 5.浮点型数组排序 三.使用冒泡排序思想模拟实现qsort函数 1.什么是冒泡排序 2.冒泡排序代码 3. 使用冒泡排序思想模拟实现qsort函数 C语言qsort函数详解 一.qsort函数是什么 我们可以使用  搜索库函数网址或者MSDN软件进行查找. qsort()函数:快速排序的函数  -引用stdlib.h头文件 参

  • C语言详细i讲解qsort函数的使用

    目录 qsort 1.int型 2.float型 3.struct型 qsort 功能:Performs a quick sort.(快速排序) 参数:void qsort( void *base, size_t num, size_t width, int (*cmp )(const void *e1, const void *e2 ) ); 头文件:#include <stdlib.h> 用法: 第一个参数待排数组的首元素地址 第二个参数待排数据个数 第三个待排数据中每个参数的大小——单位

  • C语言详细分析讲解内存管理malloc realloc free calloc函数的使用

    目录 C语言内存管理 一.动态空间申请 二.动态空间的扩容 三.释放内存 C语言内存管理 malloc && realloc && free && calloc c语言中为了进行动态内存管理,<stdlib.h>中提供了几个函数帮助进行内存管理. 我们知道,C语言中是没有C++中的容器或者说是python中list,set这些高级的数据结构的,我们一旦申请了一段内存空间以后这一段空间就归你了,比如我们举个例子,我们申请一个数组 int nums[

  • C语言详细分析讲解struct与union使用方法

    目录 一.struct 的小秘密 二.结构体与柔性数组 三.C语言中的 union 四.小结 一.struct 的小秘密 C语言中的 struct 可以看作变量的集合 struct 的问题:空结构体占用多大内存?下面编写程序看一下吧: #include <stdio.h> struct TS { }; int main() { struct TS t1; struct TS t2; printf("sizeof(struct TS) = %d\n", sizeof(stru

  • C语言详细分析讲解多文件的程序设计

    目录 一.多文件与编译器链接 二.多文件之间的相互访问 三.关于#include 四.头文件使用的一些原则 五.再论全局变量 六.注意事项 七.实验程序 八.小结 一.多文件与编译器链接 如下图所示,.o 为目标文件,链接器将不同的目标文件装配组合在一起形成一个可执行文件. 二.多文件之间的相互访问 每个文件可以定义功能接口(可被其它文件访问的函数或数据) 源文件:代码实现文件,后缀为.c 头文件:源文件的接口定义文件,后缀为.h 当需要使用其它文件提供的功能时,包含对应的头文件 语法: #in

  • C语言详细分析讲解关键字enum与sizeof及typedef的用法

    目录 一.枚举类型的使用方法 二.sizeof 关键字的用法 三.typedef 的意义 四.小结 一.枚举类型的使用方法 enum 是 C 语言中的一种自定义类型 enum 值是可以根据需要自定义的整型值 第一个定义的 enum 值默认为 0 默认情况下的 enum 值是在前一个定义值的基础上加 1 enum 类型的变量只能取定义时的离散值 enum 中定义的值是C语言中真正意义上的常量 在工程中 enum 多用于定义整型常量 下面看一段 enum 的使用代码吧: #include<stdio

  • C语言详细分析讲解关键字const与volatile的用法

    目录 一.const 只读变量 二.const 全局变量的分歧 三.const 的本质 四.const 修饰函数参数和返回值 五.volatile 解析 六.小结 一.const 只读变量 const 修饰的变量是只读的,本质还是变量 const 修饰的局部变量在栈上分配空间 const 修饰的全局变量在全局数据区分配空间 const 只在编译期有用,在运行期无用 const 修饰的变量不是真的常量,它只是告诉编译器该变量不能出现在赋值符号的左边. 二.const 全局变量的分歧 在现代C语言编

  • C语言详细分析讲解关键字goto与void的作用

    目录 一.关于goto 二.void 的意义 三.小结 一.关于goto 高手潜规则:禁用 goto 项目经验:程序质量与 goto 的出现次数成反比 最后的判决:将 goto 打入冷宫 下面看一段 goto 副作用分析的代码: #include <stdio.h> #include <malloc.h> void func(int n) { int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof

  • C语言详细分析常见字符串函数与模拟实现

    目录 一. strlen(求长度) 二. strcpy(拷贝) 三.strcat(追加) 四.strcmp 五.strncpy 六.strncat 七.strncmp 八.strstr 九.strtok 十.strerror 十一.memcpy 十二.memmove 十三.memcmp 十四.memset 一. strlen(求长度) size_t  strlen ( const char * str ) 函数的返回值类型为size_t,为无符号数,且strlen返回值为字符串中‘\0’前的字符

  • C语言详细分析讲解流程控制语句用法

    目录 一.分支语句 1.if语句 2.switch语句 二.循环语句 1.for语句 2.break和continue语句 3.循环嵌套 4.while和do…while语句 一.分支语句 1.if语句 流程控制语句可以让程序中的语句不再从上到下逐条执行 分支是一种流程控制语句,可以把程序中某些语句忽略掉不去执行 if关键字可以用来编写分支语句,只有当表达式为真时,才会执行对应语句 如果多个分支的逻辑表达式之间存在互斥关系,则可以采用else关键字把他们合并成一个分支语句 一个分支语句中的多个逻

  • C语言超全面讲解字符串函数

    目录 1.gets函数 2.puts函数 3.strcat函数 4.strcpy函数(strncpy函数) 5.strcmp函数(strncmp函数) 6.strlen函数 7.strlwr函数 8.strupr函数 9.strstr函数 注意:在使用字符串处理函数时,一定要使用#include <string.h>开头 1.gets函数 其形式为:gets(字符数组)——输入字符串的函数 作用是从终端输入一个字符串到字符数组,并且得到一个函数值. 2.puts函数 其形式为:puts(字符数

随机推荐