qsort 算法的使用

  文章作者: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函数的返回值遵循以下规则:

Compare函数返回值 描述

< 0

elem1 小于 elem2

0

elem1 等于 elem2

> 0

elem1 大于 elem2 

 

 

  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、实战 

题目描述:我比较懒,所以贴上图片吧,懒得去敲题目了, 囧……将就一下吧。

  qsort 算法的使用

  拿到这个题目,废话当然想到快排了,不然我都白讲了。好吧,上面都讲了那么多了,估计下面的代码简直是小菜一碟啦:

/*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
*/

 

 

 

转载于:https://www.cnblogs.com/ktyanny/archive/2009/12/10/1621444.html

上一篇:模拟qsort实现冒泡排序


下一篇:Observer pattern 观察者模式