荔园在线
荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀
[回到开始]
[上一篇][下一篇]
发信人: huhaiming (一生只爱她), 信区: Program
标 题: [合集]stdlib里面的快速排序和二分查找
发信站: 荔园晨风BBS站 (Fri Apr 30 18:44:12 2004), 站内信件
huhaiming (一生只爱她) 于Thu Mar 18 11:00:03 2004提到:
C++的stdlib.h里有个qsort函数,用来快速排序的
cmp是比较函数,传去两个指针,返回一个大小关系
自己写了cmp函数后,就可以用qsort了,具体的你可以找些相关的说明
四个参数,第一个是起始地址,第二个是元素个数,第三个是元素长度,第四个是
所用的比较函数
具体的例子请参看下面的两个例子。一个是整数数组的排序,一个是字符串的排序
kali (江火) 于Thu Mar 18 11:38:59 2004提到:
可不可以用如下结构排序?
struct node
{
int info;
char ch;
}a[5];
以info为关键字排序。讨教。
huhaiming (一生只爱她) 于Thu Mar 18 11:57:21 2004提到:
可以的。比较函数的大小关系是适当更改。
调用qsort时的参数也要注意更改。
int cmp(const void *p,const void *q)
{
struct node *r,*s;
r=(struct node*)p,s=(struct node*)q;
return r->info-s->info;
}
调用时: qsort(a,sizeof(a)/sizeof(a[0]),sizeof(struct node),cmp); //排序
//直接写成 qsort(a,5,sizeof(struct node),cmp); 也可以
kali (江火) 于Thu Mar 18 12:08:22 2004提到:
我这样可以得结果,你看如何?
#include <stdio.h>
#include <stdlib.h>
struct node{
int info;
char ch;
};
int n=6;
int cmp(void *p,void *q)
{
return *(int*)p-*(int*)q;
}
int main()
{
int i;/*info[6]={1,53,9,23,11,25}; */
struct node a[6]={{1,'a'},{53,'m'},{9,'p'},{23,'u'},{11,'s'},{25,'t'}};
for(i=0;i<n;i++) printf("a[%d]=%d %c\n",i,a[i].info,a[i].ch);
qsort(&a[0].info,n,sizeof(a[0]),cmp);
for(i=0;i<n;i++) printf("a[%d]=%d %c\n",i,a[i].info,a[i].ch);
return 0;
}
Dreamer (梦想的彼岸) 于Thu Mar 18 12:18:22 2004提到:
可以,但不大好
还是转换回struct node的指针使用比较安全
huhaiming (一生只爱她) 于Thu Mar 18 12:44:07 2004提到:
1、cmp的参数有误,需要用const
2、可以得到结果,但是不够安全,建议还是返回结构体的int元素大小关系会好一点
譬如:你试试更改了定义的顺序
struct node{
char ch;
int info;
};
你看看运行的结果是否还是如愿? (即时你把qsort的第一个参数修改正确为a)
kali (江火) 于Thu Mar 18 12:46:33 2004提到:
能不能说一说这里用const的功效?谢谢
huhaiming (一生只爱她) 于Thu Mar 18 12:49:50 2004提到:
1、const是qsort中第四个参数:大小关系函数的声明所需,是定义好的了,
否则编译不通过的。
2、从实际逻辑上来看,这个比较函数只是返回大小关系,是不能做出任何修改的,
为了安全性着想,也的确需要用const声明这些指针的地址。
[回到开始]
[上一篇][下一篇]
荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店