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;}}



原创粉丝点击