qsort函数的应用

    qsort函数是快速排序中常用的一个系统函数,此函数存在于#include中,现在对该函数做个简介。

基本快速排序的方法,每次把数组分成两分和中间的一个划分值,而对于有多个重复值的数组来说,基本排序的效率较低。集成在C语言库函数里面的的qsort函数,使用三路划分的方法解决这个问题。所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分。

一个典型的qsort的写法如下qsort(s,n,sizeof(s[0]),cmp);第一个参数是参与排序的数组名(或者也可以理解成开始排序的地址,因为可以写s[i]这样的表达式)。第二个参数是参与排序的元素个数。第三个参数是单个元素的大小,推荐使用sizeof(s[0])这样的表达式。第四个参数就是比较函数,这个函数通常需要我们自己去定义,现在举例子来说明如何第一这个函数(函数名称可以自己定义)

    例一:对一个数组中的元素进行快速。

例如, int a[5]={11,2,45,23,8},现在我们对这个数组进行序。

1.升序排列: int cmp(const void *a, const void *b)

{

      return (*(int *)a-*(int *)b);

}

用第一个参数减去第二个参数的值作为返回值,这样排序的结果是按元素升序排列。在主函数里调用  ”qsort(a,5,sizeof(a[0]),cmp)然后输出排序后的数组,结果是2,8,11,23,45

2.降序排列:int cmp(const void *a, const void *b)

{

      return (*(int *)b-*(int *)a);

}

用第二个参数减去第一个参数的值作为返回值,这样排序的结果是按元素降序排列。在主函数里调用”qsort(a,5,sizeof(a[0]),cmp)然后输出排序后的数组,结果是45,23,11,8,2

例二:对结构体中某个关键字进行排序(对结构体一级排序)

例如一个结构体struct sort

{

      char cstring[51];

     int  measure;  

} unsortedness[100]

现在比如我们需根据结构体中的measure型变量对结构体重新排序,此时我们要做的时根据measure型的大小对整个结构体重新排列,单单用上面的方法已经无法做到这一点,我们把函数改写成这样:

 int cmp_by_a(const void *first, const void *second)

{

    return ((sort *)first)->measure  - ((sort *)second)->measure; 

}

即把指针变成指向结构体的指针,然后对其中的measure型变量进行作差即可,再主函数里面这样调用qsort函数:qsort(unsortedness,100, sizeof(unsortedness[0]), cmp_by_a);

这样就可对结构体进行快速排列了。

例三:对字符串数组进行排序

1.使用指针数组

如对char *ai[5]={" ","ccccc","dfdfd","cdcds","dsdfs"}进行快速排序。

此时我们需注意的的是该字符串数组的写法,只能像上述那样写,不能写成二维数组的形式,如char ai[5][10]={" ","ccccc","dfdfd","cdcds","dsdfs"}这样写则是错的。

然后是如何写cmp函数的问题,应该写成这样的函数:

int cmp(const void *a, const void *b)

{

     return strcmp(*(char **)a, *(char **)b);

 

}

然后在主函数里调用qsort(ai,5,sizeof(ai[0]),cmp);即可

但是这样的写法有一个缺陷,就是初始化时如果有一个字符串为NULL的话,改程序会出现断言错误,char *ai[5]={ "ccccc","dfdfd","cdcds","dsdfs"}如这样写的话调用就会出现错误

2.使用二维数组

char str[100][100];

int cmp(const void* a,const void* b )

{

return strcmp((char *)a,(char*)b);

}

qsort(str,n,sizeof(str[0]),cmp);

值得注意的是,上面的n,很有可能你会误认为是100,这里实际应该是你要排序的个数,比如说你实际上只有str[0],str[1],str[2]这三个字符串要排序,那么n就应该是3,而不是100

struct In

{

int data;

char str[100];

}s[100];

//按照结构体中字符串str的字典顺序排序

int cmp ( const void *a , const void *b )

{

return strcmp( (*(In *)a)->str , (*(In *)b)->str );

}

例四: 按结构体中多个关键字排序(对结构体多级排序)[以二级为例]
struct Node
{
int x;
int y;
}s[100];
//
按照x从小到大排序,当x相等时按y从大到小排序

 int Comp(const void *p1,const void *p2)
{
struct Node *c=(struct Node *)p1;
struct Node *d=(struct Node *)p2;
if(c->x!=d->x) return c->x-d->x;
else return d->y - c->y;
}

例五: 对结构体中字符串进行排序:
struct Node
{
int data;
char str[100];
}s[100];
//
按照结构体中字符串 str 的字典序排序
int Comp(const void *p1,const void *p2)
{
return strcmp((*(Node *)p1).str,(*(Node *)p2).str);
}
qsort(s,100,sizeof(s[0],Comp);

 

 

Sort函数

sort 使用时得注明:using namespace std; 或直接打std::sort()  还得加上#include

例:

#include

#include

using namespace std;

int main(){

int a[20];

for(int i=0;i<20;++i)

cin>>a[i];

sort(a,a+20);//范围,很明显这里是a+20 注意,这是必要的,如果是a+19

for(i=0;i<20;i++)//最后一个值a[19]就不会参与排序。

cout<<a[i]<<endl;

std::sort是一个改进版的qsort. std::sort函数优于qsort的一些特点:对大数组采取9项取样,更完全的三路划分算法,更细致的对不同数组大小采用不同方法排序。

Third  区别:

sortqsort的升级版,如果能用sort尽量用sort,使用也比较简单,不像qsort还得自己去写cmp 函数,只要注明使用的库函数就可以使用,参数只有两个(如果是普通用法)头指针和尾指针;

默认sort排序后是升序,如果想让他降序排列,可以使用自己编的cmp函数

bool compare(int a,int b)///注意:此处的返回值是bool类型,和qsort不一样!

{

return a>b; //降序排列,如果改为return a,则为升序

}

sort(*a,*b,cmp);

#include

#include

#include

using namespace std;

class Node {

public:

char a[100];

}all[10];

bool cmp(const Node a,const Node b){

return 0>=strcmp(a.a,b.a);

}

int main(){

for(int i=0;i<10;i++){

scanf("%s",all[i].a);

}

sort(all,all+10,cmp);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值