文章目录

  • 一、函数原型
  • 二、函数解析
    • 比较函数
  • 三、手写快排
  • 四、使用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(快速排序函数)相关推荐

  1. C语言标准库函数qsort( )——数据排序

    大家好!我是保护小周ღ,本期为大家带来的是深度解剖C语言标准库函数 qsort(),qsort()函数他可以对任意类型的数据排序,博主会详细解释函数使用方法,以及使用快速排序的左右指针法模拟实现函数功 ...

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

    直接进入主题,在c语言中qsort函数是用来快速排序的,qsort有4个参数,分别是数组地址,数组元素个数,数组元素字节大小和一个比较数组元素的函数指针.让我来看一下官方给出的使用标准,上图: 让我们 ...

  3. c语言库里的排序函数,C语言标准库函数qsort详解

    1 函数简介 功 能: 使用快速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(con ...

  4. C语言标准库函数qsort具体解释

    1 函数简单介绍 功 能: 使用高速排序例程进行排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(c ...

  5. [C语言] qsort 快速排序函数讲解

    qsort库函数作用:执行快速排序 其需要引用的头文件是 : <stdlib.h> qsort 默认(按照 e1,e2 顺序)排的是升序 其中每个参数解释是: 关于比较两个元素的函数 : ...

  6. c语言的qsort快速排序函数

    目录 qsort的介绍 测试 排序int类型 排序char类型 排序结构体类型 qsort的介绍 c语言中有很多排序,比如常见的选择排序,冒泡排序,插入排序,但是c语言的库函数中,有一个qsort() ...

  7. C语言标准库函数 qsort 详解

    文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件 ...

  8. C语言标准库函数qsort排序的介绍与使用

    qsort函数包含在<stdlib.h>的头文件里. qsort函数声明如下: void qsort(void *base, size_t nmemb, size_t size, int( ...

  9. srt文件解析 c语言,c语言标准库函数srt排序的介绍与使用.docx

    c语言标准库函数srt排序的介绍与使用 C语言标准库函数qsort排序的介绍与使用 2007-05-22 19:24 qsort函数包含在的头文件里.qsort函数声明如下:void qsort(vo ...

最新文章

  1. 【WC2016】论战捆竹竿
  2. Android APK方式换肤实现原理
  3. Inchat时代真的来了?上线一周突破百万用户
  4. CSS3常用动画总结
  5. Android平台类加载流程源码分析
  6. Scrapy将爬取的段落整合为字符串
  7. shell脚本打开一个新终端并运行指定脚本
  8. C 语言取整的几种方法6,C语言有以下几种取整方法:
  9. python培训班靠谱吗-学python去哪个培训机构好?靠谱的python培训机构推荐
  10. python简单程序实例-python简单实例训练(21~30)
  11. value数字 vue_Vue数字输入框组件使用方法详解
  12. 计算机应用基础陈江鸿,广播电视大学计算机教育改革探索与实践-计算机教育论文-计算机论文(6页)-原创力文档...
  13. 基于php+Mysql新闻管理系统 开题报告
  14. java计算机毕业设计教育机构管理源码+mysql数据库+系统+lw文档+部署
  15. 英克软件结合oracle,英克科技医药行业销售管理系统
  16. 管理多个java版本,OS X中使用jEnv管理多个Java版本
  17. VMware安装Linux教程
  18. zk 系四大 L2 协议大 PK:进度、异同和生态
  19. python斐波那契数列
  20. 2013,让你正能量无限的话

热门文章

  1. 简单的股票交易接口易语言怎么获取K线图?
  2. 《扬帆优配》猪肉概念股拉升走高,新五丰一度涨停
  3. Deepin(1) Hyper-V安装Deepin系统教程
  4. 华为云连接CC,为企业出海保驾护航
  5. CSS超出用……表示并隐藏
  6. ORBSLAM2编译失败
  7. python实现mongdb的双活
  8. JavaAPI中的T和E分别代表什么?
  9. Magica Cloth笔记——1
  10. 打开acrobat pdf阅读器提示“内容准备进度”解决方法