C语言快速排序--qsort函数
C语言快速排序–qsort函数
一.什么是qsort函数
qsort函数是C语言编译器函数库自带的快速排序函数。
其包含在#include<stdlib.h>
头文件里面,所以在使用的时候需要加上该头文件。
二.qsort函数的时间复杂度
因为其本身还是快速排序,所以时间复杂度仍然是O(nlogn)
(在洛谷做题的时候,感觉它还是比传统的快排要更快,传统的快排最后三个会TLE,但是使用qsort函数就不会)
三.具体讲解
1.描述
sqort函数对数组进行排序
2.声明
下面是 qsort() 函数的声明。
void qsort(void *base, size_t nitems, size_t size, int (*compare)(const void *, const void*))
3.参数
base – 指向要排序的数组的第一个元素的指针。
nitems – 由 base 指向的数组中元素的个数。
size – 数组中每个元素的大小,以字节为单位。
compare – 用来比较两个元素的函数。
4.compare
自己定义一个compare函数,用来比较a和b的大小
int compare(const void *a,const void *b)
{return *(int*)a-*(int*)b;
}
(int *)a表示将a地址强制类型转换成整形地址类型
*(int*)a 就是得到目标地址的值
//对int型数据进行升序排序
int compare1(const void *a,const void *b)
{return *(int*)a-*(int*)b;
}//对int型数据进行降序排序
//依次类推,所有的都可以这样进行降序排序
int compare2(const void *a,const void *b)
{return *(int*)b-*(int*)a;
}//对double型数据进行升序排序
int compare3(const void *a,const void *b)
{return *(double*)a-*(double*)b;
}//对char型数据进行升序排序
int compare4(const void *a,const void *b)
{return *(char*)a-*(char*)b;
}//字符串长度排序
int cmppare5(const void *a, const void *b)
{return strlen((char *)a) - strlen((char*)b);
}
//结构体排序
int compare6(const void *a,const void *b)
{return ((*(node*)a).x-(*(node*)b).x)==0?(*(node*)a).y-(*(node*)b).y:(*(node*)a).x-(*(node*)b).x;
}
升序排序:*(int*)a-*(int*)b;
降序排序(a与b位置互换):*(int*)b-*(int*)a;
五.五种常用的qsort函数代码
1.int型
2.double型
3.char型
4.字符串型
5.结构体型
//1.对整数排序
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100010
int n,a[MAXN];//升序排序
int compare1(const void *a,const void *b)
{return *(int*)a-*(int*)b;
}//降序排序
int compare2(const void *a,const void *b)
{return *(int*)b-*(int*)a;
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&a[i]);qsort(a,n,sizeof(int),compare1);//qsort(a,n,sizeof(int),compare2);for(int i=0;i<n;i++)printf("%d ",a[i]);return 0;
}
//2.对double型排序
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100010
int n;
double a[MAXN];int compare1(const void *a,const void *b)
{return *(double*)a-*(double*)b;
}int compare2(const void *a,const void *b)
{return *(double*)b-*(double*)a;
}int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf",&a[i]);qsort(a,n,sizeof(double),compare1);for(int i=0;i<n;i++)printf("%lf ",a[i]);return 0;
}
//3.对char型排序
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100010
int n;
char a[MAXN];int compare1(const void *a,const void *b)
{return *(char*)a-*(char*)b;
}int compare2(const void *a,const void *b)
{return *(char*)b-*(char*)a;
}int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf(" %c",&a[i]);qsort(a,n,sizeof(char),compare1);for(int i=0;i<n;i++)printf("%c ",a[i]);return 0;
}
//4.1对字符串排序
//按照长度大小排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXN 100010
int n;
char a[MAXN][MAXN];int compare1(const void *a, const void *b)
{return strlen((char *)a) - strlen((char *)b);
} int compare2(const void *a, const void *b)
{return strlen((char *)b) - strlen((char *)a);
}int main()
{scanf("%d",&n);getchar(); //吃掉换行符;for(int i=0;i<n;i++)gets(a[i]);qsort(a,n,sizeof(char)*MAXN,compare1);for(int i=0;i<n;i++)printf("%s\n",a[i]);return 0;
}
//4.2对字符串排序
//按照首字母大小排序
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100010
int n;
char a[MAXN][MAXN];int compare1(const void *a,const void *b)
{return *(char*)a-*(char*)b;
}int compare2(const void *a,const void *b)
{return *(char*)b-*(char*)a;
}int main()
{scanf("%d",&n);getchar(); //吃掉换行符;for(int i=0;i<n;i++)gets(a[i]);qsort(a,n,sizeof(char)*MAXN,compare1);for(int i=0;i<n;i++)printf("%s\n",a[i]);return 0;
}
//5.对结构体排序
#include<stdio.h>
#include<stdlib.h>
#define MAXN 100010
int n;
struct node{int x;char y;
}name[MAXN];//对结构体中的x进行排序
int compare1(const void *a,const void *b)
{return (*(node*)a).x-(*(node*)b).x;
}//对结构体中的y进行排序
int compare2(const void *a,const void *b)
{return (*(node*)a).y-(*(node*)b).y;
}//利用三元运算符,将排序顺序改为:
//先按照结构体中的x进行排序,假如x相等的情况下,就按照y
//的值进行排序;
int compare3(const void *a,const void *b)
{return ((*(node*)a).x-(*(node*)b).x)==0?(*(node*)a).y-(*(node*)b).y:(*(node*)a).x-(*(node*)b).x;
}
int main()
{scanf("%d",&n);getchar(); //吃掉换行符;for(int i=0;i<n;i++)scanf("%d %c",&name[i].x,&name[i].y);qsort(name,n,sizeof(node),compare1);//qsort(name,n,sizeof(node),compare2);//qsort(name,n,sizeof(node),compare3);for(int i=0;i<n;i++)printf("%d %c\n",name[i].x,name[i].y);return 0;
}
C语言快速排序--qsort函数相关推荐
- C语言快速排序-qsort函数
目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsort进行排序 目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsor ...
- 怎么样才能做到对多种数据类型排序?C语言快速排序——qsort函数及其模拟实现
⭐️前面的话⭐️ 大家好!对于排序有许多中方法,比如冒泡排序,选择排序,希尔排序,插入排序,堆排序等等,但是怎样能够使用一个函数能够对多个数据类型进行排序呢?无所不知的C语言开发者提供了一个qsort ...
- C语言 快速排序——qsort函数详解
我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序. 为了解决这些问题!就使用qsort函数吧! 目录 一.qsort函数使用方法 二.qsor ...
- C语言程序设计之标准库快速排序qsort函数用法示例
C语言程序设计之标准库快速排序qsort函数,排序效率高,使用方便,太棒了. qsort函数定义如下: #include <stdlib.h>void qsort(void *base, ...
- C语言关于qsort函数的用法详细说明
快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法. qsort函数包含在<stdlib.h>中 qsort函数声明如下: void qsort(v ...
- 【C语言】qsort函数用法(转)
qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(cons ...
- 【C语言】—— qsort()函数的使用
要学习qsort()函数首先要先了解回调函数 文章目录 一.回调函数 二.qsort函数是什么? 三.用qsort函数排序 1. 整型 2. 结构体 3. 字符型 4. double型 四.具体样例 ...
- 【C语言】qsort函数
文章目录 前言 一.qsort函数原型 二. 1.qsort函数实现整型排序 2.qsort函数实现结构体排序 三. 冒泡排序算法模拟实现qsort函数 前言 qsort函数是八大排序算法中的快速排序 ...
- 趣谈C语言之qsort函数
在学习c语言的时候,我们接触到了冒泡排序,利用冒泡排序我们可以快速的对一个数组进行大小的比较,可是大家有没有想过一个问题,有没有一种排序方式可以排序任何类型的元素类型的呢?答案是有的,它是qsort函 ...
最新文章
- 在linux内核中获得比jiffies精度更高的时间值【转】
- neo4j——图数据库初探 - JDream314的专栏 - 博客频道 - CSDN.NET
- X.509证书的介绍
- httpbin.org的使用
- 腾讯游戏自研学术成果:基于图分割的网络表征学习初始化技术
- 前端学习(2545):找不到模块
- cad考试题库绘图题答案_2019年低压电工作业操作证考试最新版题库及答案(一)...
- metasploit-***测试工具
- php提供了什么来实现反射,php提供实现反射的方法和实例代码
- 相当于jQuery .hide()来设置可见性:隐藏
- html color 转换,Color颜色转换的三种方式(c#)
- 「首席架构师推荐」统计软件一览表
- python人工智能教程百度云_【python实战教程百度网盘】求最新python人工智能视频教程网盘链接...
- SecureCRT 64位/32位 8.3.3 中文破解版(附上1.解决SecureCRT乱码问题2.解决Hostname lookup failed: host not found问题)
- 别做正常的傻瓜-读后感
- 【动手学习深度学习】01 安装运行环境——Windows
- 2022联想小新pro14和联想小新pro16 区别 哪个好
- JS弹出确认、取消对话框
- MUSIC算法原理及MATLAB代码 阵列信号处理
- 国务院正式批准长三角规划:将建世界级城市群