望麓自卑—湖南大学最具潜力的校园传媒

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4521|回复: 12

qsort函数应用大全

[复制链接]
发表于 2007-9-4 18:05:22 | 显示全部楼层 |阅读模式
七种qsort排序方法

<本文中排序都是采用的从小到大排序>

一、对int类型数组排序

int num[100];

Sample:

int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

qsort(num,100,sizeof(num[0]),cmp);

二、对char类型数组排序(同int类型)

char word[100];

Sample:

int cmp( const void *a , const void *b )
{
return *(char *)a - *(int *)b;
}

qsort(word,100,sizeof(word[0]),cmp);

三、对double类型数组排序(特别要注意)

double in[100];

int cmp( const void *a , const void *b )
{
return *(double *)a > *(double *)b ? 1 : -1;
}

qsort(in,100,sizeof(in[0]),cmp);

四、对结构体一级排序

struct In
{
double data;
int other;
}s[100]

//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写

int cmp( const void *a ,const void *b)
{
return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1;
}

qsort(s,100,sizeof(s[0]),cmp);

五、对结构体

struct In
{
int x;
int y;
}s[100];

//按照x从小到大排序,当x相等时按照y从大到小排序

int cmp( const void *a , const void *b )
{
struct In *c = (In *)a;
struct In *d = (In *)b;
if(c->x != d->x) return c->x - d->x;
else return d->y - c->y;
}

qsort(s,100,sizeof(s[0]),cmp);

六、对字符串进行排序

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 );
}

qsort(s,100,sizeof(s[0]),cmp);

七、计算几何中求凸包的cmp

int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序
{
struct point *c=(point *)a;
struct point *d=(point *)b;
if( calc(*c,*d,p[1]) < 0) return 1;
else if( !calc(*c,*d,p[1]) && dis(c->x,c->y,p[1].x,p[1].y) < dis(d->x,d->y,p[1].x,p[1].y)) //如果在一条直线上,则把远的放在前面
return 1;
else return -1;
}

PS:

其中的qsort函数包含在的头文件里,strcmp包含在的头文件里
发表于 2007-9-4 18:12:20 | 显示全部楼层
int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

这个有个问题的。。。
如果a = 2^31-1, b = -2^31, 那就溢出了,大家要小心点。。。
发表于 2007-9-4 22:56:22 | 显示全部楼层
yiyi牛!估计srm做的比较多了。。。
刚刚试了下,还是用基于比较的比较好

#include <cstdlib>
#include <algorithm>
#include <iostream>

using namespace std;

int cmp(const void* a, const void * b)
{
  return *(int *)a - *(int *)b;
}

int cmp2(const void *a, const void *b)
{
  int aa = *(int *)a;
  int bb = *(int *)b;

  if(aa == bb)
    return 0;
  else if(aa < bb)
    return -1;
  else
    return 1;
}

bool cmp3(const int a, const int b)
{
  return a < b;
}

int main()
{
  int a[] = {-0x7fffffff - 1, 0x7fffffff};
  qsort(a, 2, sizeof(a[0]), cmp);
  cout << a[0] << " " << a[1] << endl;

  int b[] = {-0x7fffffff - 1, 0x7fffffff};
  qsort(b, 2, sizeof(b[0]), cmp2);
  cout << b[0] << " " << b[1] << endl;

  int c[] = {-0x7fffffff - 1, 0x7fffffff};
  sort(c, c + 2, cmp3);
  cout << c[0] << " " << c[1] << endl;

  return 0;
}
 楼主| 发表于 2007-9-4 23:02:39 | 显示全部楼层
东西是以前才搞ACM时找的资料,那时候还不会写qsort,现在看这些代码的确还有一些问题,这里贴出来只是给出比较函数的一些写法。
现在的题目都不是简单的一个比较就可以了,很多时候要写一些很复杂的比较函数。
发表于 2007-9-7 23:46:27 | 显示全部楼层
貌似结构体一级比较有点问题
#include <stdio.h>
#include <stdlib.h>

struct box {
  int x, y, z;
};

int cmp(const void *b1, const void *b2)
{
return (*(box *)b1)->z<(*(box *)b2)->z;
}
/*error:   base operand of `->&#39; has non-pointer type `box&#39; */

/*好像改成下面的就编译通过*/

/*int cmp(const void *b1, const void *b2)
{
  struct box *c = (box *)b1;
  struct box *d = (box *)b2;
  return ((c->z) < (d->z));
}*/

main()
{
  int n, i;
  box b[100];
  scanf("%d", &n);
  for(i=0; i<n; i++) scanf("%d%d%d", &b.x, &b.y, &b.z);
  qsort(b, n, sizeof(b[0]), cmp);
  for(i=0; i<n; i++) printf("%d %d %d\n", b.x, b.y, b.z);
  return 0;
}
发表于 2007-9-8 00:21:42 | 显示全部楼层
对于STL中的sort用法如下:
数组 :
int a[100];
sort(a, a+100);
容器
vector<string> word_list;
sort(word_list.begin(), word_list.end());
自定义类型
struct Edge {
  int x, int next;
};
bool cmp(const Edge& a, const Edge& b) {
  return a.x < b.x;
}
vector<Edge> ed;
sort(ed.begin(), ed.end(), cmp);

熟悉这个之后就不用记很多qsort参数啦~~
发表于 2007-9-8 18:09:47 | 显示全部楼层
C++的algorithm头文件中才有sort
如果想用C写怎么办......
发表于 2007-9-8 18:16:30 | 显示全部楼层
#include <C++>
发表于 2007-9-8 19:07:00 | 显示全部楼层
呵呵``sort的用法我会
我只是想熟悉一下qsort的用法而已
 楼主| 发表于 2007-9-9 00:33:08 | 显示全部楼层
以前死活不用C++,现在纯C程序也用G++编译了。C++有时候的确方便一点

以前写Qsort的比较函数这样的:
struct node
{
  int a,b;
}
int cmp(struct node *a,struct node *b)
{
  if (a->a==b->a) return a->b > b->b ? 1 : -1;
  else return a->a > b->a ? 1 : -1;
}
直接指明类型也是可以的
发表于 2007-9-9 16:10:59 | 显示全部楼层
多谢xnby大牛!!!
貌似浮点数比较才用三目运算符
return a->a > b->a ? 1 : -1;

return a->a > b->a;
有什么区别??
 楼主| 发表于 2007-9-9 20:44:10 | 显示全部楼层
a->a > b->a
是一个布尔表达式,放回的值是0或1
而 a->a > b->a ? 1 : -1; 放回的是1或-1
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

每日推荐上一条 /1 下一条

小黑屋|手机版|湖南大学望麓自卑校园传媒 ( 湘ICP备14014987号 )

GMT+8, 2024-6-17 13:32 , Processed in 0.261177 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表