当前位置: 首页 > article >正文

C语言qsort函数的使用详解

文章目录

  • 一、qsort函数简介
    • 1.函数原型
    • 2.参数含义
    • 3.比较函数详解
  • 二、比较函数使用案例
    • 1.整型数组
    • 2.字符数组
    • 3.double型数组
    • 4.字符串
      • 1.按字符串首字母进行排序
      • 2.按字符串长度进行排序
      • 3.按字典进行排序
    • 5.结构体
  • 三、qsort函数完整使用案例
    • 1.整型数组
    • 2.字符数组
    • 3.double型数组
    • 4.字符串
      • 1.按字符串首字母进行排序
      • 2.按字符串长度进行排序
      • 3.按字典进行排序
    • 5.结构体

一、qsort函数简介

qsort()函数是C语言库函数中的一种排序算法,其用到的排序思想是快速排序(quicksort)。它的独特之处在于可以排序任意类型的数组元素(整形、浮点型、字符串和结构体类型)。

1.函数原型

void qsort ( void * base, size_t num, size_t size, int ( * comparator ) ( const void *, const void * ) );

2.参数含义

void * base:待排序数组的首地址。
size_t num:数组元素的个数。
size_t size:一个数组元素的大小(所占字节数)。
int ( * comparator ) ( const void *, const void * ):首先它是一个函数指针,指向的函数是排序函数;其此所包含的两个参数为所比较元素的地址;最后是参数类型为void*的原因是它的独特之处,可以接收任意类型的参数。

3.比较函数详解

以整形排序为例:

int cmp_int( const void * elem1, const void * elem2 )
{return *(int*)elem1-*(int*)elem2;
}

此函数为自定义函数(比较函数),函数的返回值类型为 int 类型,总共有三种情况:< 0:elem1小于elem2;0:elem1等于elem2;> 0:elem1大于elem2。

(const void * elem1, const void * elem2) 

两个参数表示所要比较元素的地址,之所以参数的接收类型为 void* 是因为比较元素的类型是不清楚的,只能以 void* 这个万能桶进行接收;const表示指针所指向元素的值无法更改。`

return *(int*)elem1-*(int*)elem2;

对两个元素指针进行强制类型转化为整型指针,再进行解引用获取比较元素的值,最后将两个元素的差值返回。当然也可以根据比较元素的类型将其强制类型转化。

二、比较函数使用案例

1.整型数组

int cmp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}

2.字符数组

int cmp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}

3.double型数组

int cmp_double(const void* elem1, const void* elem2)
{return *(double*)elem1 > *(double*)elem2 ? 1 : -1;
}

注:此函数返回类型为 int 型,浮点型相减的数字会丢失小数点后的数字从而造成误差。若差值为大于零且小于一,则返回值会被设置为零。

4.字符串

1.按字符串首字母进行排序

int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}

2.按字符串长度进行排序

int cmp_string(const void* elem1, const void* elem2)  
{  return strlen((char * )elem1) > strlen((char * )elem2) ? 1 : -1;  
}

3.按字典进行排序

int cmp_string(const void* elem1, const void* elem2)
{return strcmp((char*)elem1,(char*)elem2);
}

5.结构体

struct Stu
{char name[10];int grade;
} s;

1.一级排序:对所有学生进行名字排序。

int cmp_name(const void* elem1, const void* elem2)
{return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);
}

2.二级排序:若名字相同则按照成绩再进行排序,若有三级排序,以此类推。

int cmp_s(const void* elem1, const void* elem2)
{if ((strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name))!=0)return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);elsereturn ((Stu*)elem1)->grade - ((Stu*)elem2)->grade;
}

三、qsort函数完整使用案例

1.整型数组

int cmp_int(const void* elem1, const void* elem2)
{return *(int*)elem1 - *(int*)elem2;
}
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);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

2.字符数组

int cmp_char(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2;
}
int main()
{char arr[] = { 'g', 'f', 'e', 'd', 'c', 'b', 'a' };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_char);for (int i = 0; i < sz; i++){printf("%c ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

3.double型数组

int cmp_double(const void* elem1, const void* elem2)
{return *(double*)elem1 > *(double*)elem2 ? 1 : -1;
}
int main()
{double arr[10] = { 5.32, 9.34, 1.27, 0.28, 0.98, 8.98, 5.69, 4.33, 7.01, 9.90 };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_double);for (int i = 0; i < sz; i++){printf("%f ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

4.字符串

1.按字符串首字母进行排序

int cmp_string(const void* elem1, const void* elem2)
{return *(char*)elem1 - *(char*)elem2; 
}
int main()
{char arr[6][10] = { "grape", "face", "dog", "cat", "black", "apple" };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_string);for (int i = 0; i < sz; i++){printf("%s ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

2.按字符串长度进行排序

int cmp_string(const void* elem1, const void* elem2)  
{  return strlen((char * )elem1) > strlen((char * )elem2) ? 1 : -1;  
}
int main()
{char arr[6][10] = { "aaa", "aaaaa", "aaaaaaa", "aaaaaa", "aa", "aaaa" };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_string);for (int i = 0; i < sz; i++){printf("%s ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

3.按字典进行排序

int cmp_string(const void* elem1, const void* elem2)
{return strcmp((char*)elem1,(char*)elem2);
}
int main()
{char arr[6][10] = { "grrfdg","adew","gderfe","abrfggfe","lerf","lmnp" };int sz = sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_string);for (int i = 0; i < sz; i++){printf("%s ", arr[i]);}printf("\n");return 0;
}

在这里插入图片描述

5.结构体

一级排序与字符串的比较类似,直接看二级排序。

typedef struct Stu
{char name[10];int grade;
}Stu;
int cmp_s(const void* elem1, const void* elem2)
{if ((strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name))!=0)return strcmp(((Stu*)elem1)->name, ((Stu*)elem2)->name);elsereturn ((Stu*)elem1)->grade - ((Stu*)elem2)->grade;
}
int main()
{Stu s[] = { { "zhaoda", 89 }, { "qianer", 100 }, { "sunsan", 101 }, { "lisi", 121 }, { "sunsan", 95 }, {"zhaoda",78} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_s);for (int i = 0; i < sz; i++){printf("%s %d\n", s[i].name,s[i].grade);}return 0;
}

在这里插入图片描述

http://www.lryc.cn/news/2417890.html

相关文章:

  • 2023最新个人博客文章发布系统的设计与实现(毕业设计+论文+开题报告+运行)
  • Android 游戏开发入门指南(一)
  • java Map遍历的5种方法和一些基本使用
  • Cocoa 框架概述
  • alternatives命令总结
  • PS(Photoshop)去水印的4个方法
  • MPEG音频文件格式(包括MP3文件格式)详解
  • 思科RIP路由协议介绍与实验操作步骤
  • 1.图文并茂详解Linux安装,客户端连接,xshell,虚拟机,虚拟网卡配置
  • 【统计类知识】大数定律与中心极限定理
  • 【笔记】位图(.bmp)和矢量图(Vector):位图是点阵图或光栅图,使用像素的一格一格来描述图像,放大以后每一个像素看就像是一个个的马赛克;矢量图是使用直线和曲线来描述图形,可以无限方法,不会失真
  • conan 详解
  • 什么是DI(依赖注入),依赖注入的原理
  • 数据库的索引
  • 用AVPlayer播放视频
  • 说走就走的「Windows」—— Windows To Go 制作详解
  • 算法篇-----粒子群算法
  • linux解压缩命令大全
  • html网页制作——HTML5响应式个人简历网站模板 web前端网页制作课作业
  • 项目介绍——面向对象与软件工程实验四
  • flex与bison入门,编译原理:flex编写词法分析器(使用windows环境)
  • NIVIDIA 硬解码学习2
  • 泛函分析的優勢在數值解析中:高效計算與準確度的平衡
  • 向量的点乘和叉乘
  • 打印机连接三种方式
  • Netbeans 适配C/C++、JAVA防坑秘笈
  • JS中几个getElementByXXX方法的区别
  • Varnish的基本应用详解
  • 使用autoit,可以节省您很多时间
  • 图文结合!非常详细Linux简介与安装!