qsort函数(快速排序用法举例)

来源:互联网 发布:linux运维面试简历项目 编辑:程序博客网 时间:2024/05/22 06:07

上一篇讲了sort函数的用法,现在讲讲库函数qsort的用法,qsort是快速排序的库函数,包含头文件#include”stdlib.h”,其函数原型如下:

void qsort(void *base,int nelem,int width,int(*fcmp)(const void *,const void*));

各参数代表的含义是:

1:待排序数组首地址;    2:数值中待排序元素数量;

3:各元素的占用空间大小;4:指向函数的指针(实际运用中函数名就是函数指针)。

下面按照数组元素的数据类型分类讲解qsort函数的用法。针对不同应用场景选用合适的cmp函数,可以快速简便的实现排序。

A:整型数据

#include "iostream"#include "stdlib.h"using namespace std;int cmp(const void*a,const void*b)//降序,qsort函数默认升序,而实现升序规则只需调换成a-b的形式即可{return *(int*)b-*(int*)a;}int main(){int  a[6]={1,2,3,4,5,6},i;qsort(a,6,sizeof(int),cmp); //  a是被排序的数组   6是排序元素的个数                              //sizeof(int)是每个元素所占的字节数  cmp是排序规则for(i=0;i<6;i++)                          //输出printf("%d ",a[i]);return 0;}
运行结果为:

B:char 型数据(以下只给出关键实现代码,不做结果展示)

int cmp(const void*a,const void*b){return *(char*)a-*(char*)b;}char c[10];qsort(c,10,sizeof(char),cmp);
C:double型数据(double型数据排序时不是用运算符,而是用比较符,这点需要注意)

int cmp(const void*a,const void*b){return *(double*)a>*(char*)b?;1-1;}double in[10];qsort(in,10,sizeof(double),cmp);
D:结构体第一级排序(只对结构体中某个元素进行排序)

int cmp(const void*a,const void*b){return (*(double*)a).data>(*(char*)b).data?;1-1;}struct in{int data;int other;}s[10];qsort(s,10,sizeof(s[0]),cmp);
E:结构体的第二级排序(先以第一个元素为规则排序,若相等则按第二个元素进行排序)这可以运用到很多不仅仅是以一个关键字进行排序的场合,很方便实用

int cmp(const void*a,const void*b)//以x从小到大排序,若相等则以y从大到小排序{struct in*c=(in*)a;struct in*d=(in*)b;if(c->x!=d->x)return c->x-d->x;elsereturn d->y-c->y;}struct in{int x;int y;}s[10];qsort(s,10,sizeof(s[0])),cmp);

以上便是qsort函数针对不同数据类型的用法,最后再附上sort函数对字符串进行排序的有趣应用,希望大家在以后编程过程中能排上用场。

F:字符串型数据用法

struct in{int data;char str[100];}s[10];int cmp(const void *a ,const void *b){return strcmp((*(in*)a)->str,(*(in*)b)->str);}qsort(s,10,sizeof(s[0]),cmp);

G:sort函数对字符串排序的用法

#include "iostream"#include "algorithm"using namespace std;bool fun(const char *s1, const char *s2){if(strcmp(s1, s2) < 0)return  true;elsereturn false;}int main(){char *names[]=    //sort实现字符窜的排序写法{"could","you","sort","me","please","thank","you!"};cout<<"排序前字符串为:";for(int i = 0; i < 7; ++i){cout << names[i] << ends;}cout << endl;sort(&names[0], &names[7], fun);cout<<"排序后字符串为:";for(int i = 0; i < 7; ++i){cout << names[i] <<ends;// endl;}cout << endl;return 0;}
运行结果如下:

其中ends和endl的用法也是很奇妙的,有兴趣的诸君可以自行尝试。









0 0
原创粉丝点击