荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: 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软件 网络书店