网站建设资讯

NEWS

网站建设资讯

c语言qsort函数(快速排序)-创新互联

c语言qsort函数(快速排序)

创新互联公司是专业的孝南网站建设公司,孝南接单;提供成都网站制作、网站设计、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行孝南网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

在学习c语言时我们常常会遇到一些排序的问题,在遇到这些排序的问题的时候,我们当然可以自己选择写出自己的排序方法来进行排序。但是我们今天要介绍的是c语言库函数中所提供的一个快排函数。这个函数可以直接提供给我们快排这样一个工具,在面对一些情况的时候会起到事半功倍的效果。此外,它能够排序任意数据类型的数组其中包括整形,浮点型,字符串甚至还有自定义的结构体类型,合理使用时非常方便。

一.qsort函数的参数

下图为cplusplus.com的标准库函数说明

其函数声明如下

void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));

1.首元素地址base

我们要排序一组数据,首先我们需要找到这组数据在哪,因此我们直接将首元素的地址传给qsort函数的指针void*来确定从这个数组的哪个地方开始排序。

2.元素的个数num

我们将需要排序的元素的个数传给qsort函数来确定一组数据。这是因为我们知道了从哪开始,也要知道在哪结束才能确定一组需要排序的数据,但是我们不方便直接将结尾元素的地址传入函数。

3.元素大小size

我们需要将元素大小传入qsort函数。qsort函数能排序任意数据类型的一组数据,因此我们用void*类型的指针来接收元素,但是我们知道void*类型的指针不能进行加减操作,也就是说无法移动。那么在函数内部我们究竟用什么类型的指针来操作变量呢?其实在函数内部,我们可以将void*类型的指针强制类型转换成char*类型的指针后来逐个字节地来操作元素,因为char*类型的指针移动的单位字节长度是1个字节,我们只需要知道需要操作的数据是几个字节就可以实现指针从一个元素恰好能够移动到下一个元素。

4.用户自定义的比较函数compar

我们需要告诉qsort函数我们希望数据按照怎么的方式进行比较。同需要传递元素个数的道理一样,qsort函数能排序任意数据类型的一组数据,因此库函数用void*类型的指针来指定我们我们编写的比较方式,可以起到不把函数写死,根据实际情况的需要写的作用。同时我们可以看到编写的函数的返回值大于零时,qsort函数会将数组里面前一个元素放在后一个元素后面,也就是两个元素进行调换。

二.比较函数的书写

qsort函数给cmpar函数规定了特定的参数const void* 。因此我们自定义函数时要严格遵守其参数设定。

如果你需要比较的是整形数组,你需要将比较函数中void*强制转换成int *,同时如果你希望qsort

进行升序快排,我们需要使得前一个数字比后一个数字大的时候返回1.

int compar(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}

同理如果需要进行降序快排的话

int compar(const void* e1, const void* e2)
{
    return *(int*)e2 - *(int*)e1;
}

比较的是字符串的大小,并进行升序快排的话:

int compare_str(const void* e1, const void* e2)
{
    return strcmp((char*)e1, (char*)e2);
}

比较的是字符串的长度,并进行升序快排的话:

int cmp_str_len(const void* e1, const void* e2)
{
    return strlen((char*)e1)-strlen((char*)e2);
}

比较结构体时需要指明需要比较的具体变量,就像我们不能比较一个人,除非有相应的标准:

int cmp_struct_stu_name(const void* e1, const void* e2)
{
    return strcmp(   ((struct stu*)e1)->name, ((struct stu*)e2)->name );
}
int cmp_struct_stu_GPA(const void* e1, const void* e2)
{
    return (  ((struct stu*)e2)->GPA - ((struct stu*)e1)->GPA  );
}
三.实例演示
#define _CRT_SECURE_NO_WARNINGS 1
#include#includestruct stu
{
    char name[20];
    float GPA;
};
int compare_str(const void* e1, const void* e2)
{
    return strcmp((char*)e1, (char*)e2);
}
int cmp_str_len(const void* e1, const void* e2)
{
    return strlen((char*)e1) - strlen((char*)e2);
}
int cmp_struct_stu_name(const void* e1, const void* e2)
{
    return strcmp(   ((struct stu*)e1)->name, ((struct stu*)e2)->name   );
}
int cmp_struct_stu_GPA(const void* e1, const void* e2)
{
    return (  ((struct stu*)e2)->GPA - ((struct stu*)e1)->GPA  );
}
int main()
{
    int i = 0;
    struct stu s[3] = { {"zhangsan",3.4} ,{"zhangmazi",4.0} ,{"dingzhen",1.0} };
    qsort(s, 3, sizeof(s[0]), cmp_struct_stu_name);
    for (i = 0; i< 3; i++)
    {
        printf("%s  %f\n", s[i].name, s[i].GPA);
    }
        qsort(s, 3, sizeof(s[0]), cmp_struct_stu_GPA);
    for (i = 0; i< 3; i++)
    {
        printf("%s  %f\n", s[i].name, s[i].GPA);
    }

}

可以看到只需要我们按要求写好参数qsort函数就能够帮我们对元素进行排序。

四.函数所需要的头文件

包含在stdlib.h头文件中,函数一共有四个参数,没有返回值。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


新闻标题:c语言qsort函数(快速排序)-创新互联
文章URL:http://cdweb.net/article/hhdcs.html