【C语言】快速排序函数qsort()

2023-11-15

函数原型

#include<stdlib.h>

void qsort(void*, size_t, size_t, int ( * )(const void * ,  const void *  ))
  1. 第一个参数为待排序数组首地址。

可直接输入待排序数组名,或是指向数组的指针。

  1. 第二个参数为数组长度。

size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。
可以直接输入待排序的数组的长度。

  1. 第三个参数为数组元素所占字节。

可直接用sizeof(a[0])计算字数组单个元素的节数。

  1. 第四个参数为所调用函数的指针,函数名即是函数的指针,可直接写函数名,调用函数用来确定排序的方式。

先以整型递增排序为例

int inc (const void * a,const void *b)
 {
return * (int * )a-* (int *)b;
}
  1. int inc 表示函数返回一个int值。inc为函数名 ,表示递增排序(increase),也可以自己命名。
  2. ( const void * a, const void * b)将两个要对比的元素的地址传入函数。 (加const表示无法改变指针指向的值)
  3. return * ( int * )a - * ( int * ) b ,返回一个整型数,表示两个元素对比的结果。如果a大于b,则返回正数。a小于b,则返回负数。如果a等于b,则返回零。(int *)表示将地址强制类型转换成整形地址类型,可根据排序对象选择指针类型的转换。也可以改变算式,例如用 return strlen((char * )a) > strlen((char * )b) ? 1 : -1; 可以返回比较字符串长度的结果,用来根据字符串长度进行排序, 下面有相关的代码。

各种数据类型的升序排序函数

(如果要降序排序,只需将return里的a,b反过来写即可。)

1. 整型

int inc (const void * a,const void *b)
 {
return *(int *)a - *(int *)b;
}

2. double型

int inc (const void * a, const void * b)
{
return *(double *)a > *(double *)b ? 1 : -1;
}

注: 这里两个浮点数相减但要返回一个整型数,如果按上面做法直接减会丢失小数点部分。所以需另加处理,直接判断大小,如果a大于b,则返回1,否则返回-1。

3. 字符排序

int inc(const void *a,const void *b)
{
   return *(char *)a - *(char *)b;
}

4. 字符串排序

char am = { {"...."}, {"....."}, .....};
qsort(a, m, sizeof(char * )  * n, inc);
1. 根据字符串首字母排序
  ```c
  int inc(const void *a, const void *b)  
  {  
  return * (char *)a - *(char * )b;  
  }  
  ```
2. 根据字符串长度排序
  ```c
  int inc(const void *a, const void *b)  
  {  
  return strlen((char * )a) > strlen((char * )b) ? 1 : -1;  
  } 
  ```

注:这里不要用 return strlen((char * )a) - strlen((char * )b) ;
原因:
1. strlen返回类型为size_t,size_t是标准C库中定义的,应为unsigned int,在64位系统中为 long unsigned int。无符号整型最好不要做四则运算。
2. 这里虽然函数返回int型,会把无符号数转换为整型,但返回结果只在字符串的长度未超过int的范围时正确。这种大范围转小范围要考虑精度损失的问题。

3. 按字典排序字符串。
  ```c
  int inc(const void *a, const void *b)
  {
   return (strcmp((char *)a, (char *)b));
  }
  ```

5. 结构体

struct node
{
   double one;
   int two;
} s[100];
1.一级排序

根据double型的one的大小排序结构体。

int inc( const void *a ,const void *b)
{
return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
}

2.二级排序

先根据double型的one的大小排序,若两值相等,在根据int型two的大小排序。

int inc( const void *a , const void *b )
{
if((* (node * )a).one != ( * (node * )b).one)
return ( * (node * )a).one > ( * (node * )b).one ? 1 : -1;
else return (* (node * )a).two -( * (node * )b).two;
}

具体样例

1. 整型

#include<stdio.h>
#include<stdlib.h>
#define L 20
int inc(const void *a, const void *b)
{
	return *(int *)a - *(int *)b;
 } 
int main ()
{
	int a[L] = {0, 5, 2, 3, 4, 9, 8, 7, 6, 1,
		11, 15, 14, 12, 13, 16, 17, 18, 19, 10};
	qsort(a, L, sizeof(int), inc);
	for (int i = 0; i < L; i++)
	{
		printf("%d ", a[i]);
	}
 } 

整型结果

2.double型

#include<stdio.h>
#include<stdlib.h>
#define L 20
int inc(const void *a, const void *b)
{
	return *(double *)a > *(double *)b? 1 : -1;
 } 
int main ()
{
	double a[L] = {0.1, 0.11, 1.1, 1.5, 1.8, 1.51, 2.5, 2.9, 1.3, 0.8, 
		15.5, 7.9, 8.5, 8.51, 8.6, 3, 1.41, 1.11, 1.51, 2};
	qsort(a, L, sizeof(double), inc);
	for (int i = 0; i < L; i++)
	{
		printf("%.2lf\n", a[i]);
	}
 } 

运行结果 :
double

3.字符型

#include<stdio.h>
#include<stdlib.h>
#define L 20
int inc(const void *a, const void *b)
{
	return *(char *)a - *(char *)b;
 } 
int main ()
{
	char a[L] = {'q', 'w', 'r', 'h', 'a', 'v', 'g', 'e', 'b', 'l',
		'o', 'p', 'u', 'y', 't', 'c', 'x', 'i', 'z', 's'};
	qsort(a, L, sizeof(char), inc);
	for (int i = 0; i < L; i++)
	{
		printf("%c ", a[i]);
	}
 } 

运行结果 :
这里写图片描述

4.字符串

  1. 按首字母排序
#include<stdio.h>
#include<stdlib.h>
#define L 10
#define K 10
int inc(const void *a, const void *b)
{
	return *(char *)a - *(char *)b;
 } 
int main ()
{
	char a[L][K] = {
		"rbsc",
		"jcse",
		"efgd",
		"arbs",
		"bbs",
		"cbfe",
		"dgafg" ,
		"ewqrta",
		"ofgd",
		"mbcv",
	};
	qsort(a, L, sizeof(char) * K, inc);
	for (int i = 0; i < L; i++)
	{
		printf("%s\n", a[i]);
	}
 } 

运行结果 :
这里写图片描述

  1. 按长度排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int inc(const void *a, const void *b)
{
	return strlen((char *)a) > strlen((char *)b) ? 1 : -1;
 } 
int main ()
{
	char a[L][K] = {
		"rbsc",
		"jcsse",
		"efgdsd",
		"arbs",
		"bbs",
		"cbfefaa",
		"dgafg" ,
		"ewqrta",
		"ofgd",
		"mbcv312",
	};
	qsort(a, L, sizeof(char) * K, inc);
	for (int i = 0; i < L; i++)
	{
		printf("%s\n", a[i]);
	}
 } 

运行结果 :
这里写图片描述
3. 按字典顺序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
#define K 10
int inc(const void *a, const void *b)
{
	return strcmp((char * )a, (char *)b);
 } 
int main ()
{
	char a[L][K] = {
		"rbsc",
		"jcsse",
		"afgdsd",
		"arbs",
		"abs",
		"cbfefaa",
		"cgafg" ,
		"ewqrta",
		"ofgd",
		"mbcv312",
	};
	qsort(a, L, sizeof(char) * K, inc);
	for (int i = 0; i < L; i++)
	{
		printf("%s\n", a[i]);
	}
 } 

运行结果:
这里写图片描述

5.结构体

结构体二级排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define L 10
typedef struct node {
 	double first;
 	int numb;
 }node;
 
int inc(const void *a, const void *b)
{
	if((* (node *)a).first != ( * (node *)b).first)
	return ( * (node * )a).first > ( * (node * )b).first ? 1 : -1;
	else return (* (node * )a).numb -( * (node * )b).numb;

 } 
 
int main ()
{
	node arr[L] = {
		1.0, 1,
		2.0, 2,
		1.1, 3,
		2.1, 4,
		3.5, 5,
		1.0, 6,
		1.1, 7,
		5.1, 8,
		5.0, 9,
		3.6, 10,
		
	};
	qsort(arr, L, sizeof(node), inc);
	for (int i = 0; i < L; i++)
	{
		printf("%.2lf %d\n", arr[i].first, arr[i].numb);
	}
 } 

运行结果:
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】快速排序函数qsort() 的相关文章

  • 获取电商网站主图和详情图的浏览器插件

    介绍 搞图宝 专门获取各大电商平台详情页面主图和详情图的浏览器插件 现已支持京东 京东国际 淘宝 天猫 coupang 1688 naver gmarket alibaba 兰亭集势 谷歌浏览器下载地址 Google Chrome 网络浏览
  • SPI Flash芯片W25Q32英文版数据手册解读(一)---------引脚功能,工作模式

    W25Q32芯片是一个可以通过SPI 串行外围设备接口 操作的flash存储器 这篇文章备忘和总结一下英文版数据手册的一些解读 有关时序及具体用STC单片机编写程序的内容等下一篇文章 一 芯片引脚功能 我买的是8引脚 SOIC封装的芯片 如
  • MyBatis框架从入门到精通(一)MyBatis概述

    mybatis做为目前国内最为流行的开源orm框架 我们平时在使用时会感受到其带来的诸多便利 但是很少去深入分析 mybatis源码代码量不多 功能丰富 是一个很好的学习样例 本系列文章就和大家一起来学习mybatis框架 本系列笔记根据动
  • PSM+DID

    PSM DID 模型是由倾向得分匹配模型 Propensity Score Matching 以下简称 PSM 和双重差分模型 Differences in Differences 以下简称 DID 结合而成 其中 PSM 负责为受处理的个

随机推荐

  • python求解数字的平均值、方差、中位数

    定义数字输入函数 def getNum nums iNumStr input 请输入数字 回车退出 while iNumStr 当输入为空时 跳出循环 nums append eval iNumStr 在nums列表后加入输入的数字 iNu
  • 微信小程序审核代码提示wx.getLocation暂未配置在app.json中教你如何解决

    今天上传微信小程序代码时遇到的问题 解决方法 在app json里面进行配置 requiredPrivateInfos getLocation 查找官方API接口 原来是这样 我们再去微信公众平台官网 扫码进入我们的小程序服务 找到开发管理
  • 项目代码中参数的管理:mmcv中的Config包&argparse导入参数

    Config 当我们项目的超参数很多时 在文中设定和修改并不方便 这时我们需要项目中所有参数放入一个文件夹中 方便管理和修改 例如 config config py中包含了我们模型需要的所有参数 然后我们使用mmcv包中的Config函数对
  • Python实现链表

    文章目录 由一个等号引起的思考 链表 单链表 双链表 单向循环链表 由一个等号引起的思考 链表是由一个个被系统随机分配地址的结点们通过指针进行相连 以c 为例子 在写链表的时候可以使用结构体进行实现 struct node ElemType
  • 【vue2】实现查询功能及排序功能

    一 前言 之前写过一篇相关的文章 那个时候对于vue查询不甚了解 现在重新温习一次vue 有了新的认识 但是将新的也是通俗易懂的理解分享给大家 希望一起进步 二 业务场景 实现动态查询 输入框输入内容 然后列表根据输入框内容动态显示 截图
  • 思维导图TheBrain实用教程——如何选择主题并自定义主题颜色?

    TheBrain 您的终极数字记忆和无限思维导图软件 我们从一个想法跳到另一个想法 构建越来越复杂的网络 直到新想法形成 TheBrain允许你以同样的方式组织你的信息 而不限制你预先确定的文件结构 事实上 你的数字大脑是没有限制的 你可以
  • 如何开发一个App(Android)

    前言 本篇博客从开发的角度来介绍如何开发一个Android App 需要说明一点是 这里只是提供一个如何开发一个app的思路 并不会介绍很多技术上的细节 从整个大局去把握如何去构思一个app的开发 让你对独立开发一款app的时候有个理解 如
  • tia v15 添加项目_西门子S7-1500plc与S7-300plcPN/IO设备通信-创建项目

    西门子S7 1500plc与S7 300plcPN IO设备通信 PROFINET的CPU支持I device功能 即智能IO设备功能 也就是该PN设备可以同时作为IO控制器和IO设备 一个PN智能设备功能不但可以作为一个智能处理单元处理生
  • SpringSecurity连接数据库的使用

    一 简介 Spring 是非常流行和成功的 Java 应用开发框架 Spring Security 正是 Spring 家族中的成员 Spring Security 基于 Spring 框架 提供了一套 Web 应用安全性的完整解决方案 正
  • 【ASP.NET MVC系列】浅谈ASP.NET 页面之间传值的几种方式

    ASP NET MVC系列文章 01 浅谈Google Chrome浏览器 理论篇 02 浅谈Google Chrome浏览器 操作篇 上 03 浅谈Google Chrome浏览器 操作篇 下 04 浅谈ASP NET框架 05 浅谈AS
  • webpack-插件

    插件 Plugins 插件是 wepback 的支柱功能 webpack 自身也是构建于 你在 webpack 配置中用到的相同的插件系统之上 插件目的在于解决 loader 无法实现的其他事 剖析 webpack 插件是一个具有 appl
  • 操作系统实验:FCFS调度和SPF调度算法(C语言)

    实验内容 已知一组进程P1 P2 P3 及其到达时间和服务时间 参考下图 分别采用FCFS调度算法和SPF调度算法 求各个进程的完成时间 周转时间 带权周转时间 平均周转时间和平均带权周转时间 实验目的 熟悉FCFS调度算法的实现过程 熟练
  • CSS 图片偏移技术以及坐标问题

    CSS中通过图片偏移技术可以实现将众多小图标放入一个图片中 网页加载时只需要加载一个图片即可实现得到众多小图标的功能 这是前端设计时候对图片的一种优化方式 图片偏移技术只是一个属性而已 即 background position 100px
  • anaconda已经有sklearn,但是pycharm不能导入的解决方法

    问题 D software Anaconda3 Lib site packages文件夹里已经有sklearn这个文件夹 但是pycharm里import时无法识别到 原因 在pycharm里点击文件 gt 设置 gt 项目 gt Pyth
  • 仿微信底部菜单栏(ViewPager+ImagerView+TextView)

    前言 在市面上 大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理 通常都是分为3 5个大模块 从而正确有效地引导用户去使用我们的APP 实现底部菜单栏的方法也有很多种 1 仿微信底部菜单栏 ViewPager ImagerVie
  • CSS之继承

    1 什么是css继承 继承是css中非常重要的一个概念 当你为HTML中的某个元素赋予CSS样式时 这些样式不仅仅会影响当前元素 有的样式还会影响该元素的子元素 这些下层子元素继承上层祖先元素样式属性的特点 就称为css继承 2 css继承
  • 职业规划——我是如何在第一份工作中就能做到部门副经理的?

    这个标题一出来 想必应该就有相当一部分人在无限嘴嗨 what 这人装啥B 吹B也不带打草稿的 还以为是哪个大厂出来的 就一无名小公司 坐上去不停容易的嘛 还发出来博人眼球干啥 是的 您没看错 就是一名非计算机专业毕业的98年大专生 在一家有
  • PHP集成环境vscode配置debug

    PHP集成环境vscode配置debug 1 首先phpstudy配置下图 打开XDebug 监听端口9005 2 php ini配置 当前环境对应版本的php ini文件 用记事本打开 确认最后的XDebug如下 Xdebug zend
  • 增加数据盘 小于2T XFS文件系统

    parted dev sdb mklabel msdos mkpart p xfs 0 100 mkfs xfs dev sdb1 blkid Edit etc fstab and add UUID
  • 【C语言】快速排序函数qsort()

    快速排序函数 函数原型 各种数据类型的升序排序函数 1 整型 2 double型 3 字符排序 4 字符串排序 1 根据字符串首字母排序 2 根据字符串长度排序 3 按字典排序字符串 5 结构体 1 一级排序 2 二级排序 具体样例 1 整