qsort用法

mac2022-06-30  26

1。qsort, 即快速排序, 包含在<cstdlib>或<stdlib.h>中, 函数有四个参数, 没有返回值 下面是一个典型的写法: qsort(s,n,sizeof(s[0]),cmp); 其中, s是需要排序的数组名,  也可以理解成开始地址,   因为你如果只需要对数组的部分排序的话, s可以写成&s[i]的形式的 第二个参数n是参与排序的元素个数, 第三个参数是单个元素的大小, 通常我们用sizeof()来获取大小,  因为它足够放心 绝对无毒^_^ 而且 很多时候我们需要对结构体进行排序的 你很难把握它的大小的~ 最后一个参数, 也就是我今天对着愣了很久的东东了 什么鸟东西嘛,   搞得忒神密-_-!!!! cmp是一个比较函数 不过这不是系统定义好的函数 而是需要自己手动写的 也就是说 你可以把它叫做abcd或是rubbish什么 因为是比较函数 我比较习惯用cmp cmp的典型定义是                                                                       

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

其中返回值必须是int,两个参数的类型必须都是const void *, 这样你可以对他进行强制转换成任何其他类型 有点想C#中的box 哈~~

假设是对int排序的话,如果是升序,那么就是如果a比b大cmp返回一个正值,小则负值,相等返回0

当然当你对具体的数组进行排序的话 cmp里面就要做具体的处理

2。 七种常见排法!!!

一、对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 - * ( char * )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 ; }

转载于:https://www.cnblogs.com/cyiner/archive/2011/05/16/2048246.html

相关资源:sort 与qsort 使用方法 结构体多级排序 适合于acm竞赛
最新回复(0)