C语言标准库函数qsort(快速排序函数)
文章目录
- 一、函数原型
- 二、函数解析
- 比较函数
- 三、手写快排
- 四、使用qsort
- 1、对int数组排序
- 2、对double数组排序
- 3、对char数组排序
- 4、对字符串排序
- (1)char s[][]
- (2)char *s[]
- 5、对结构体排序
- (1)一级排序
- (2)二级排序
- 五、例题
一、函数原型
qsort包含在<stdlib.h>头文件中,根据你给出的比较函数进行快速排序,通过指针移动实现排序,排序之后的结果仍然放在原数组中,使用qsort函数必须自己写一个比较函数。
函数原型:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void , const void))
参数:
- base – 指向要排序的数组的第一个元素的指针。
- nitems – 由 base 指向的数组中元素的个数。
- size – 数组中每个元素的大小,以字节为单位。
- compar – 用来比较两个元素的函数。
返回值: 无返回值。
二、函数解析
常见的qsort写法:void qsort(s, n, sizeof(s[0]), cmp);
- 第一个参数是参与排序的数组名(也就是开始排序的地址,所以&s[i],也是可以的)。
- 第二个参数是参与排序的元素的个数。
- 第三个参数是单个元素的大小(sizeof(s[0])这样就是获取到s[0]的元素大小)。
- 第四个参数是一个函数,定义qsort排序排序规则的函数。
比较函数
cmp比较函数(qsort它的比较函数名取什么都可以,cmp只是我看大家都这么写,习惯了!)
比较函数cmp的定义: int cmp(const void *a, const void *b);
- 返回值必须是int,两个参数的类型也必须是const void *。(变量名随意)
- 如果a与b的位置需要互换,则需要返回正值;若不需要互换,则返回非正值即可。(也就是正值是互换,非正值维持原状)
- 若是对int排序,升序,如果a比b大返回一个正值,小则返回负值,相等返回0。(
*(int*)a - *(int*)b
返回值) - 函数体内要对a,b进行强制类型转化后才能得到正确的值。(
(int*)
)
三、手写快排
void quick_sort(int q[], int l, int r)
{if (l >= r) return;int i = l - 1, j = r + 1, x = q[l + r >> 1];while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j), quick_sort(q, j + 1, r);
}
四、使用qsort
1、对int数组排序
#include<stdio.h>
#include<stdlib.h>int cmp(const void *a, const void *b){return *(int *)a - *(int *)b;//升序
// return *(int *)b - *(int *)a;//降序
}int main()
{int n,s[10000];scanf("%d", &n);for(int i=0;i<n;i++)scanf("%d",&s[i]);qsort(s, n, sizeof(s[0]), cmp);for(int i=0;i<n;i++)printf("%d ",s[i]);return 0;}
2、对double数组排序
在对浮点或者double型的对其进行判断返回相应的数(可以使用三目运算符或者if语句),因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系。
#include<stdio.h>
#include<stdlib.h>int cmp(const void *a, const void *b){return ((*(double *)a - *(double *)b)>0?1:-1);//升序
// return ((*(double *)a - *(double *)b)<0?1:-1);//降序
}int main()
{int n;double s[10000];scanf("%d", &n);for(int i=0;i<n;i++)scanf("%lf",&s[i]);qsort(s, n, sizeof(s[0]), cmp);for(int i=0;i<n;i++)printf("%lf ",s[i]);return 0;}
3、对char数组排序
与int类型相似
#include<stdio.h>
#include<stdlib.h>int cmp(const void *a, const void *b){return *(char *)a - *(char *)b;//升序
// return *(char *)b - *(char *)a;//降序
}int main()
{int n;char s[10000];scanf("%d", &n);getchar();for(int i=0;i<n;i++)scanf("%c",&s[i]);qsort(s, n, sizeof(s[0]), cmp);for(int i=0;i<n;i++)printf("%c ",s[i]);return 0;}
4、对字符串排序
(1)char s[][]
strcmp() :字符串比较库函数,可以看看这篇博客博客
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp(const void *a, const void *b){return strcmp((char *)a, (char *)b);//升序
// return strcmp((char *)b, (char *)a);//降序
}int main()
{int n;char s[1000][1000];scanf("%d", &n);for(int i=0;i<n;i++)scanf("%s",s[i]);qsort(s, n, sizeof(s[0]), cmp);for(int i=0;i<n;i++)printf("%d:%s\n",i,s[i]);return 0;}
(2)char *s[]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int cmp(const void *a, const void *b){return strcmp(*(char **)a, *(char **)b);//升序
// return strcmp(*(char **)b, *(char **)a);//降序
}int main()
{int n;char *s[1000];scanf("%d", &n);for(int i=0;i<n;i++){s[i] = (char *)malloc(sizeof(char *));//分配空间 scanf("%s",s[i]);}qsort(s, n, sizeof(s[0]), cmp);for(int i=0;i<n;i++)printf("%d:%s\n",i,s[i]);return 0;}
5、对结构体排序
(1)一级排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct node{int id;
}s[100]; int cmp(const void *a, const void *b){struct node *aa = (node *)a;struct node *bb = (node *)b;return ((aa->id)>(bb->id))?1:-1;//升序
// return ((aa->id)>(bb->id))?-1:1;//降序
}int main()
{int n;scanf("%d", &n);for(int i=0;i<n;i++)scanf("%d",&s[i].id);qsort(s, n, sizeof(s[0]), cmp);for(int i=0;i<n;i++)printf("%d\n",s[i].id);return 0;}
(2)二级排序
#include<stdio.h>
#include<stdlib.h>
#include<string.h>struct node{int id;char data;
}s[100]; int cmp(const void *a, const void *b){struct node *aa = (node *)a;struct node *bb = (node *)b;if(aa->id == bb->id)//若id相同,按照data排序 return aa->data - bb->data;else//否则按照id排序 return aa->id - bb->id;//升序
}int main()
{int n;scanf("%d", &n);for(int i=0;i<n;i++)scanf("%d %c",&s[i].id,&s[i].data);qsort(s, n, sizeof(s[0]), cmp);printf("\n");for(int i=0;i<n;i++)printf("%d %c\n",s[i].id,s[i].data);return 0;} /*
5
1 c
1 b
1 a
2 a
3 a
*/
五、例题
题目链接
复杂排序规则题
#include<stdio.h>
#include<stdlib.h>
struct Data{long int id;int d;int c;int tote;
};
struct Data s[4][100000],r;
int cmp(const void *a,const void *b){struct Data e1=*(struct Data *)a;struct Data e2=*(struct Data *)b;if((e1.d+e1.c)!=(e2.d+e2.c)){return (e2.d+e2.c)>(e1.d+e1.c);}else if(e1.d!=e2.d){return e2.d>e1.d;}else{return e1.id>e2.id;}
}
int main()
{int a,b,N,L,H,g[4]={0};scanf("%d %d %d",&N,&L,&H);for(a=0;a<N;a++){scanf("%ld %d %d",&r.id,&r.d,&r.c);r.tote=r.d+r.c;if(r.d>=L&&r.c>=L){if(r.d>=H&&r.c>=H){b=0;s[b][g[0]++]=r;}else if(r.d>=H){b=1;s[b][g[1]++]=r;}else if(r.d>=r.c){b=2;s[b][g[2]++]=r;}else{b=3;s[b][g[3]++]=r;}}}qsort(s[0],g[0],sizeof(s[0][0]),cmp);qsort(s[1],g[1],sizeof(s[1][0]),cmp);qsort(s[2],g[2],sizeof(s[2][0]),cmp);qsort(s[3],g[3],sizeof(s[3][0]),cmp);printf("%d\n",g[0]+g[1]+g[2]+g[3]);for(a=0;a<4;a++)for(b=0;b<g[a];b++)printf("%ld %d %d\n",s[a][b].id,s[a][b].d,s[a][b].c);return 0;
}
C语言标准库函数qsort(快速排序函数)相关推荐
- C语言标准库函数qsort( )——数据排序
大家好!我是保护小周ღ,本期为大家带来的是深度解剖C语言标准库函数 qsort(),qsort()函数他可以对任意类型的数据排序,博主会详细解释函数使用方法,以及使用快速排序的左右指针法模拟实现函数功 ...
- C语言qsort快速排序函数详解
直接进入主题,在c语言中qsort函数是用来快速排序的,qsort有4个参数,分别是数组地址,数组元素个数,数组元素字节大小和一个比较数组元素的函数指针.让我来看一下官方给出的使用标准,上图: 让我们 ...
- c语言库里的排序函数,C语言标准库函数qsort详解
1 函数简介 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(con ...
- C语言标准库函数qsort具体解释
1 函数简单介绍 功 能: 使用高速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(c ...
- [C语言] qsort 快速排序函数讲解
qsort库函数作用:执行快速排序 其需要引用的头文件是 : <stdlib.h> qsort 默认(按照 e1,e2 顺序)排的是升序 其中每个参数解释是: 关于比较两个元素的函数 : ...
- c语言的qsort快速排序函数
目录 qsort的介绍 测试 排序int类型 排序char类型 排序结构体类型 qsort的介绍 c语言中有很多排序,比如常见的选择排序,冒泡排序,插入排序,但是c语言的库函数中,有一个qsort() ...
- C语言标准库函数 qsort 详解
文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件 ...
- C语言标准库函数qsort排序的介绍与使用
qsort函数包含在<stdlib.h>的头文件里. qsort函数声明如下: void qsort(void *base, size_t nmemb, size_t size, int( ...
- srt文件解析 c语言,c语言标准库函数srt排序的介绍与使用.docx
c语言标准库函数srt排序的介绍与使用 C语言标准库函数qsort排序的介绍与使用 2007-05-22 19:24 qsort函数包含在的头文件里.qsort函数声明如下:void qsort(vo ...
最新文章
- 【WC2016】论战捆竹竿
- Android APK方式换肤实现原理
- Inchat时代真的来了?上线一周突破百万用户
- CSS3常用动画总结
- Android平台类加载流程源码分析
- Scrapy将爬取的段落整合为字符串
- shell脚本打开一个新终端并运行指定脚本
- C 语言取整的几种方法6,C语言有以下几种取整方法:
- python培训班靠谱吗-学python去哪个培训机构好?靠谱的python培训机构推荐
- python简单程序实例-python简单实例训练(21~30)
- value数字 vue_Vue数字输入框组件使用方法详解
- 计算机应用基础陈江鸿,广播电视大学计算机教育改革探索与实践-计算机教育论文-计算机论文(6页)-原创力文档...
- 基于php+Mysql新闻管理系统 开题报告
- java计算机毕业设计教育机构管理源码+mysql数据库+系统+lw文档+部署
- 英克软件结合oracle,英克科技医药行业销售管理系统
- 管理多个java版本,OS X中使用jEnv管理多个Java版本
- VMware安装Linux教程
- zk 系四大 L2 协议大 PK:进度、异同和生态
- python斐波那契数列
- 2013,让你正能量无限的话