c语言调用库函数qsort()进行快速排序
来源:互联网 发布:linux 移动整个文件夹 编辑:程序博客网 时间:2024/05/16 06:16
前言
各种排序方法中,例如冒泡、插入,快排等我最喜欢用快速排序,特别欣赏快排的分治思想,调用系统的qsort函数前希望大家也能了解一下快速排序的原理,参考链接见:http://blog.csdn.net/zinss26914/article/details/8043168
qsort函数原型
void qsort(void *base, size_t nmemb, size_t size, int(*compare) (const void *, const void *));
函数原型在<stdlib.h>中找到
参数详解
base : 指向数组中第一个元素(如果只是对数组的一段区域进行排序,那么要使base指向这段区域的第一个元素)nmemb: 要排序元素的数量size : 每个数组元素的大小,用字节来衡量compare : 指向比较函数的指针
重点
数组的元素可能是任何类型的,甚至可能是结构体或联合,所以必须告诉函数qsort如何确定两个数组元素哪一个“更小”。通过编写比较函数可以为qsort提供这些信息。当给定两个指向数组元素的指针p和q时,比较函数必须返回一个整数,如果*p小于*q,那么返回的数为负数;如果*p等于*q,那么返回0.如果*p大于*q,返回正数.按照这种结果返回,qsort对数组默认是升序排序.如果想降序,只需要将上述结果返回值*-1即可
测试用例
int&&char数组排序(c代码)
以int数组为测试例子,进行排序
#include <stdio.h>#include <stdlib.h>int compi(const void *a, const void *b){const int *p = a;const int *q = b;return *p - *q;}int compd(const void *a, const void *b){const int *p = a;const int *q = b;return (*p - *q) * (-1);}int main(){int a[1000];int i, len, type;while(scanf("%d %d", &len, &type) != EOF){for(i = 0; i < len; i ++){scanf("%d", &a[i]);}switch(type){case 1 ://递增排序qsort(a, len, sizeof(a[0]), compi);break;case 2 ://递减排序qsort(a, len, sizeof(a[0]), compd);break;}if(type == 1){printf("递增排序结果:\n");}else{printf("递减排序结果:\n");}for(i = 0; i < len; i ++){printf("%d ", a[i]);}printf("\n");}return 0;}
测试结果:
结构体数组排序
大同小异,简单的贴一道acm题,来说明结构体数组排序的方法吧
excel排序
题目描述: Excel可以对一组纪录按任意指定列排序。现请你编写程序实现类似功能。 对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。输入: 测试输入包含若干测试用例。每个测试用例的第1行包含两个整数 N (N<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号。以下有N行,每行包含一条学生纪录。每条学生纪录由学号(6位数字,同组测试中没有重复的学号)、姓名(不超过8位且不包含空格的字符串)、成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开。当读到 N=0 时,全部输入结束,相应的结果不要输出。输出: 对每个测试用例,首先输出1行“Case i:”,其中 i 是测试用例的编号(从1开始)。随后在 N 行中输出按要求排序后的结果,即:当 C=1 时,按学号递增排序;当 C=2时,按姓名的非递减字典序排序;当 C=3 时,按成绩的非递减排序。当若干学生具有相同姓名或者相同成绩时,则按他们的学号递增排序。样例输入:3 1000007 James 85000010 Amy 90000001 Zoe 604 2000007 James 85000010 Amy 90000001 Zoe 60000002 James 984 3000007 James 85000010 Amy 90000001 Zoe 60000002 James 900 0样例输出:Case 1:000001 Zoe 60000007 James 85000010 Amy 90Case 2:000010 Amy 90000002 James 98000007 James 85000001 Zoe 60Case 3:000001 Zoe 60000007 James 85000002 James 90000010 Amy 90
ac代码
#include <stdio.h>#include <stdlib.h>#include <string.h>struct student{char num[7];char name[9];int grade;};int compareByNum(const void *a, const void *b);int compareByName(const void *a, const void *b);int compareByGrade(const void *a, const void *b);int main(){int i, n, k;struct student people[100001];static int size = 1;while(scanf("%d %d", &n, &k) != EOF){if(n == 0)break;//接收客户端数据for(i = 0; i < n; i ++){scanf("%s %s %d", people[i].num, people[i].name, &people[i].grade);}//快速排序switch(k){case 1 ://按学号排序qsort(people, n, sizeof(people[0]), compareByNum);break;case 2 ://按姓名排序qsort(people, n, sizeof(people[0]), compareByName);break;case 3 ://按成绩排序qsort(people, n, sizeof(people[0]), compareByGrade);break;}//打印输出printf("Case %d:\n", size ++);for(i = 0; i < n; i ++){printf("%s %s %d\n", people[i].num, people[i].name, people[i].grade);}}return 0;}int compareByNum(const void *a, const void *b){const struct student *p = a;const struct student *q = b;return strcmp(p->num, q->num);}int compareByName(const void *a, const void *b){const struct student *p = a;const struct student *q = b;if(strcmp(p->name, q->name) > 0){return 1;}else if(strcmp(p->name, q->name) == 0 && strcmp(p->num, q->num) > 0){return 1;}else{return -1;}}int compareByGrade(const void *a, const void *b){const struct student *p = a;const struct student *q = b;if(p->grade > q->grade){return 1;}else if(p->grade == q->grade && strcmp(p->num, q->num) > 0){return 1;}else{return -1;}}
- c语言调用库函数qsort()进行快速排序
- c语言调用库函数qsort()进行快速排序
- 调用库函数进行的qsort快速排序
- 菜鸟学C语言三:快速排序与调用C语言库函数qsort()
- 如何利用C语言中的qsort库函数实现快速排序?
- c语言库函数 qsort(快速排序函数)
- 如何利用C语言中的qsort库函数实现快速排序
- 调用c语言库函数实现快速排序
- C/C++ 库函数快速排序 qsort
- 在C语言的库函数中就有快速排序的库函数,即为qsort
- C语言qsort快速排序
- C语言库函数qsort
- 【c语言】利用库函数进行快速排序(升)
- C语言下使用快速排序qsort
- C语言中用qsort()快速排序
- C语言中用qsort()快速排序
- 快速排序 qsort c语言代码
- qsort函数 C语言快速排序函数
- mysql中主键自动增长时的几种情况
- 前段/oa开发必备jquery ui
- 用拦截器解决页面JSP缓存问题
- Oracle建立DBLINK的详细步骤记录
- 把文件用base64进行转码
- c语言调用库函数qsort()进行快速排序
- Android ListView的cell的分割线
- android学习之-Listview的几种问题
- hdu1005 Number Sequence
- 菜鸟的卢修斯
- ASP.NET C# 连接MSSQL数据库 详细图解
- vc编译warning LNK4089和链接警告LNK4098解决方法
- JSF中的h:commandLink 链接详解
- php的socket服务端监听与客户端访问实例脚本