qsort 算法的使用
2009-12-10 22:59
155 查看
文章作者:ktyanny 文章来源:ktyanny 转载请注明,谢谢合作。 话说ktyanny莫名其妙的,以0票的选举进入党校培训(0票说来话长,但是一个好学生是会受到别人的爱戴的,所以大家要好好学习做个好学生!)。今天又是上党课的时候,书记纠结了两个多小时,一直在问你们入党的动机是什么,怎么加强党性修养。纠结了两个小时之后,导致的结果是,ktyanny突然醒悟过来,既然自己说不想涉足政治方面,那入党还真的有点莫名其妙呢。好了,流水账就记那么多了。
ktyanny一直都有用sort算法,不过不知道qsort算法是怎么回事,在好奇心的驱使下,我打开MSDN,研究了一下。
1、qsort的原型如下:void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
记住:头文件是——<stdlib.h>看清楚啦
2、参数说明:(英文比较简单就不翻译了)
base——Start of target array.
num——Array size in elements.
width——Element size in bytes.
comparison function——The first parameter is a pointer to the key for the search and the second parameter is a pointer to the array element to be compared with the key.
3、进一步深入compare函数 一直吸引我的眼球的与其说是qsort函数,不如说是他的那个compare函数的妙用之处吧。
compare( (void *) & elem1, (void *) & elem2 );
神奇的compare函数的返回值遵循以下规则:
MSDN是这样子说的:
“The array is sorted in increasing order, as defined by the comparison function. To sort an array in decreasing order, reverse the sense of "greater than" and "less than" in the comparison function.
This function validates its parameters. If compare or num is NULL, or if base is NULL and *num is nonzero, or if width is less than zero, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, the function returns and errno is set to EINVAL.”
其实这几句英语很简单的,不过怕某些人太懒得看英文,我来锻炼以下我的英语水平吧。MSDN是这样说的:compare函数原本定义的是让数组执行递增排列的操作。为了使数组按照递减的顺序排列,可以置换"greater than" 和 "less than"以达到这个效果。此函数验证其参数。如果参数compare或num是null,或者是基数是NULL和* num是非零,或者 width小于零,无效的参数请求,就是所说的无效参数。如果继续执行,则函数返回并且errno将被设置成EINVAL(好了,好像翻译得也不是很好懂,还是自己看英文的吧,呵呵……)
4、深入了解qsort函数
之前做过一个蘑菇题,大概是说一个比赛事项的,题目给出了比赛的结果,但是要求聪明的你去整理这些比赛结果。输出结果要求按得分高的先输出,如果得分一样高,那么就看谁的的一名(或其他高名次)最多的先输出,如果分数一样,等级也一样,那么就看谁的姓名排在字典顺序的前面就先输出谁。好了,题目就差不多这样了,是不是很很蘑菇很BT,
5、实战
题目描述:我比较懒,所以贴上图片吧,懒得去敲题目了, 囧……将就一下吧。
拿到这个题目,废话当然想到快排了,不然我都白讲了。好吧,上面都讲了那么多了,估计下面的代码简直是小菜一碟啦:
/*by ktyanny 2009.12.10*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define NAMELENGTH 30 /*最长名字*/
#define NSUITORS 100 /*suitors的最大数目*/
#define BESH 180
#define BESW 75
typedef struct
{
char first[NAMELENGTH];/*first name of suitor*/
char last[NAMELENGTH];/*last name of suitor*/
int height;
int weight;
}suitor;
suitor suitors[NSUITORS];
int nsuitors;
void read_suitors()
{
char first[NAMELENGTH], last[NAMELENGTH];
int height;
int weight;
nsuitors = 0;
while(scanf("%s %s %d %d\n", suitors[nsuitors].first,
suitors[nsuitors].last, &height, &weight) != EOF)
{
suitors[nsuitors].height = abs(height - BESH);
if(weight > BESW)
suitors[nsuitors].weight = weight - BESW;
else
suitors[nsuitors].weight = -weight;
nsuitors++;
}
}
/*cmp神奇之处*/
int cmp(const void *a, const void *b)
{
int result;
if((*(suitor *)a).height < (*(suitor *)b).height) return -1;
if((*(suitor *)a).height > (*(suitor *)b).height) return 1;
if((*(suitor *)a).weight < (*(suitor *)b).weight) return -1;
if((*(suitor *)a).weight > (*(suitor *)b).weight) return 1;
if((result = strcmp((*(suitor *)a).last, (*(suitor *)b).last)) != 0) return result;
return (strcmp((*(suitor *)a).first, (*(suitor *)b).first));
}
/*看完cmp之后感触到什么了吧*/
int main()
{
int i;
read_suitors();
qsort(suitors, nsuitors, sizeof(suitor), cmp);
for(i = 0; i < nsuitors; i++)
printf("%s, %s\n", suitors[i].last, suitors[i].first);
return 0;
}
/*
George Bush 195 110
Harry Truman 180 75
Bill Clinton 180 75
John Kennedy 180 65
Ronald Reagan 165 110
Richard Nixon 170 70
Jimmy Carter 180 77
*/
ktyanny一直都有用sort算法,不过不知道qsort算法是怎么回事,在好奇心的驱使下,我打开MSDN,研究了一下。
1、qsort的原型如下:void qsort(
void *base,
size_t num,
size_t width,
int (__cdecl *compare )(const void *, const void *)
);
记住:头文件是——<stdlib.h>看清楚啦
2、参数说明:(英文比较简单就不翻译了)
base——Start of target array.
num——Array size in elements.
width——Element size in bytes.
comparison function——The first parameter is a pointer to the key for the search and the second parameter is a pointer to the array element to be compared with the key.
3、进一步深入compare函数 一直吸引我的眼球的与其说是qsort函数,不如说是他的那个compare函数的妙用之处吧。
compare( (void *) & elem1, (void *) & elem2 );
神奇的compare函数的返回值遵循以下规则:
Compare函数返回值 | 描述 |
---|---|
< 0 | elem1 小于 elem2 |
0 | elem1 等于 elem2 |
> 0 | elem1 大于 elem2 |
“The array is sorted in increasing order, as defined by the comparison function. To sort an array in decreasing order, reverse the sense of "greater than" and "less than" in the comparison function.
This function validates its parameters. If compare or num is NULL, or if base is NULL and *num is nonzero, or if width is less than zero, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, the function returns and errno is set to EINVAL.”
其实这几句英语很简单的,不过怕某些人太懒得看英文,我来锻炼以下我的英语水平吧。MSDN是这样说的:compare函数原本定义的是让数组执行递增排列的操作。为了使数组按照递减的顺序排列,可以置换"greater than" 和 "less than"以达到这个效果。此函数验证其参数。如果参数compare或num是null,或者是基数是NULL和* num是非零,或者 width小于零,无效的参数请求,就是所说的无效参数。如果继续执行,则函数返回并且errno将被设置成EINVAL(好了,好像翻译得也不是很好懂,还是自己看英文的吧,呵呵……)
4、深入了解qsort函数
之前做过一个蘑菇题,大概是说一个比赛事项的,题目给出了比赛的结果,但是要求聪明的你去整理这些比赛结果。输出结果要求按得分高的先输出,如果得分一样高,那么就看谁的的一名(或其他高名次)最多的先输出,如果分数一样,等级也一样,那么就看谁的姓名排在字典顺序的前面就先输出谁。好了,题目就差不多这样了,是不是很很蘑菇很BT,
5、实战
题目描述:我比较懒,所以贴上图片吧,懒得去敲题目了, 囧……将就一下吧。
拿到这个题目,废话当然想到快排了,不然我都白讲了。好吧,上面都讲了那么多了,估计下面的代码简直是小菜一碟啦:
/*by ktyanny 2009.12.10*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define NAMELENGTH 30 /*最长名字*/
#define NSUITORS 100 /*suitors的最大数目*/
#define BESH 180
#define BESW 75
typedef struct
{
char first[NAMELENGTH];/*first name of suitor*/
char last[NAMELENGTH];/*last name of suitor*/
int height;
int weight;
}suitor;
suitor suitors[NSUITORS];
int nsuitors;
void read_suitors()
{
char first[NAMELENGTH], last[NAMELENGTH];
int height;
int weight;
nsuitors = 0;
while(scanf("%s %s %d %d\n", suitors[nsuitors].first,
suitors[nsuitors].last, &height, &weight) != EOF)
{
suitors[nsuitors].height = abs(height - BESH);
if(weight > BESW)
suitors[nsuitors].weight = weight - BESW;
else
suitors[nsuitors].weight = -weight;
nsuitors++;
}
}
/*cmp神奇之处*/
int cmp(const void *a, const void *b)
{
int result;
if((*(suitor *)a).height < (*(suitor *)b).height) return -1;
if((*(suitor *)a).height > (*(suitor *)b).height) return 1;
if((*(suitor *)a).weight < (*(suitor *)b).weight) return -1;
if((*(suitor *)a).weight > (*(suitor *)b).weight) return 1;
if((result = strcmp((*(suitor *)a).last, (*(suitor *)b).last)) != 0) return result;
return (strcmp((*(suitor *)a).first, (*(suitor *)b).first));
}
/*看完cmp之后感触到什么了吧*/
int main()
{
int i;
read_suitors();
qsort(suitors, nsuitors, sizeof(suitor), cmp);
for(i = 0; i < nsuitors; i++)
printf("%s, %s\n", suitors[i].last, suitors[i].first);
return 0;
}
/*
George Bush 195 110
Harry Truman 180 75
Bill Clinton 180 75
John Kennedy 180 65
Ronald Reagan 165 110
Richard Nixon 170 70
Jimmy Carter 180 77
*/
相关文章推荐
- 第15周项目-2-洗牌-使用STL的算法
- qsort使用方法
- 条款33:提防在指针的容器上使用类似remove的算法
- 分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项
- 分页解决方案 之 分页算法——Pager_SQL的详细使用方法和注意事项
- C库函数qsort七种使用方法示例
- C语言自带的快速排序(qsort)函数使用方法
- 从零开始学C++之STL(七):剩下5种算法代码分析与使用示例(remove 、rotate 、sort、lower_bound、accumulate)
- 使用STL中的泛型算法sort
- 常用加密解密算法【RSA、AES、DES、MD5】介绍和使用
- C++ STL 算法另类使用方法
- 多重背包O(N*V)算法详解(使用单调队列)
- 使用LZMA算法(转载)
- 机器学习实战——使用K-近邻算法进行约会配对
- 算法题:不使用+-×/求一个数的7倍
- 算法分析中的实现n个数的全排列,使用java语言
- C++ 插入迭代器,算法使用
- [算法]贪心算法的详解以及使用
- DNS通道检测 国内学术界研究情况——研究方法:基于特征或者流量,使用机器学习决策树分类算法居多
- DNS通道检测 国外学术界研究情况——研究方法:基于流量,使用机器学习分类算法居多,也有使用聚类算法的;此外使用域名zif low也有