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函数相关推荐

  1. C语言快速排序-qsort函数

    目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsort进行排序 目录 一.qsort简介 二.qsort详解 1)函数原型 2)快速排序源码 三.使用qsor ...

  2. 怎么样才能做到对多种数据类型排序?C语言快速排序——qsort函数及其模拟实现

    ⭐️前面的话⭐️ 大家好!对于排序有许多中方法,比如冒泡排序,选择排序,希尔排序,插入排序,堆排序等等,但是怎样能够使用一个函数能够对多个数据类型进行排序呢?无所不知的C语言开发者提供了一个qsort ...

  3. C语言 快速排序——qsort函数详解

    我们在使用冒泡排序法做题的时候,经常会遇到运算次数过多程序超时的情况,而且冒泡排序法只能对整形数组进行排序. 为了解决这些问题!就使用qsort函数吧! 目录 一.qsort函数使用方法 二.qsor ...

  4. C语言程序设计之标准库快速排序qsort函数用法示例

    C语言程序设计之标准库快速排序qsort函数,排序效率高,使用方便,太棒了. qsort函数定义如下: #include <stdlib.h>void qsort(void *base, ...

  5. C语言关于qsort函数的用法详细说明

    快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法. qsort函数包含在<stdlib.h>中 qsort函数声明如下: void qsort(v ...

  6. 【C语言】qsort函数用法(转)

    qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(cons ...

  7. 【C语言】—— qsort()函数的使用

    要学习qsort()函数首先要先了解回调函数 文章目录 一.回调函数 二.qsort函数是什么? 三.用qsort函数排序 1. 整型 2. 结构体 3. 字符型 4. double型 四.具体样例 ...

  8. 【C语言】qsort函数

    文章目录 前言 一.qsort函数原型 二. 1.qsort函数实现整型排序 2.qsort函数实现结构体排序 三. 冒泡排序算法模拟实现qsort函数 前言 qsort函数是八大排序算法中的快速排序 ...

  9. 趣谈C语言之qsort函数

    在学习c语言的时候,我们接触到了冒泡排序,利用冒泡排序我们可以快速的对一个数组进行大小的比较,可是大家有没有想过一个问题,有没有一种排序方式可以排序任何类型的元素类型的呢?答案是有的,它是qsort函 ...

最新文章

  1. 在linux内核中获得比jiffies精度更高的时间值【转】
  2. neo4j——图数据库初探 - JDream314的专栏 - 博客频道 - CSDN.NET
  3. X.509证书的介绍
  4. httpbin.org的使用
  5. 腾讯游戏自研学术成果:基于图分割的网络表征学习初始化技术
  6. 前端学习(2545):找不到模块
  7. cad考试题库绘图题答案_2019年低压电工作业操作证考试最新版题库及答案(一)...
  8. metasploit-***测试工具
  9. php提供了什么来实现反射,php提供实现反射的方法和实例代码
  10. 相当于jQuery .hide()来设置可见性:隐藏
  11. html color 转换,Color颜色转换的三种方式(c#)
  12. 「首席架构师推荐」统计软件一览表
  13. python人工智能教程百度云_【python实战教程百度网盘】求最新python人工智能视频教程网盘链接...
  14. SecureCRT 64位/32位 8.3.3 中文破解版(附上1.解决SecureCRT乱码问题2.解决Hostname lookup failed: host not found问题)
  15. 别做正常的傻瓜-读后感
  16. 【动手学习深度学习】01 安装运行环境——Windows
  17. 2022联想小新pro14和联想小新pro16 区别 哪个好
  18. JS弹出确认、取消对话框
  19. MUSIC算法原理及MATLAB代码 阵列信号处理
  20. 国务院正式批准长三角规划:将建世界级城市群

热门文章

  1. 【OJ每日一练】1010 - 找出二五仔的ID
  2. 古色古香、清雅幽韵之站点一览
  3. 吴恩达机器学习--多类别分类:一对多
  4. L1范数 L2范数
  5. 英特尔淘汰迷你电脑,宣布放弃 NUC 业务!
  6. chrome浏览页面常用快捷键
  7. 警察是否可以随意查看公民手机
  8. 为了父母.你需要知道中风了怎么做
  9. 递归算法与两个经典问题:汉诺塔问题和八皇后问题
  10. linux shell重定向(输入输出重定向)讲解