C/C++语言函数库中有很多排序函数,今天说一下qsort()快速排序函数。源码如下:
void qsort ( void * base, size_t nmem, size_t size, int ( * comp) ( const void * , const void * ) ) ;
它根据comp所指向的函数所提供的顺序对base所指向的数组进行排序,nmem为参加排序的元素个数,size为每个元素所占的字节数。
例如要 对元素进行升序排列,则定义comp所指向的函数为:如果其第一个参数比第二个参数小,则返回一个小于0的值,反之则返回一个大于0的值,如果相等,则返 回0。
例:
# include < stdio. h>
# include < stdlib. h>
int comp( const void * , const void * ) ;
int main( int argc, char * argv[ ] )
{
int i;
int array[ ] = { 6, 8, 2, 9, 1, 0} ;
qsort ( array, 6, sizeof ( int ) , comp) ;
for ( i = 0; i < 6; i + + ) {
printf ( "%d\t" , array[ i] ) ;
}
printf ( "\n" ) ;
return 0;
}
int comp( const void * p, const void * q)
{
return ( * ( int * ) p - * ( int * ) q) ;
} 首先:看一下这个函数的原型
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
compare( (void *) elem1, (void *) elem2 );
void *base //被排序的项目
size_t num//被排序的项目的数目
size_t width//被排序单个项目所占内存
int (__cdecl *compare )(const void *elem1, const void *elem2 ) //大小比较函数 compare( (void *) elem1, (void *) elem2 );//函数的是返回值
返回值的描述 < 0 elem1 比 elem2 小 0 elem1 等于 elem2 > 0 elem1 比 elem2 大 一、对int类型数组排序int num[100];int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);
示例代码:
#include<iostream.h>
#include<stdlib.h>
int compare(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
void main()
{
int num[10]={11,35,65,25,79,54,34,66,92,30};
qsort(num,10,sizeof(int),compare);
for(int i=0;i<10;i++)
cout<<num[i]<<endl;
}
二、对char类型数组排序(同int类型)
char word[100];
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);
//按照结构体中字符串str的字典顺序排序
struct In
{
int data;
char str[100];
}s[100];
int cmp ( const void *a , const void *b )
{
return strcmp( (*(In *)a)->str , (*(In *)b)->str );
}
qsort(s,100,sizeof(s[0]),cmp);
六、对字符串进行排序
示例代码:
#include<iostream.h>
#include<stdlib.h>
#include<string.h>
//using namespace std;
int compare(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);
}
void main()
{
char *str[3]={"leebame","miyan","love"};
qsort(str,4,sizeof(str[0]),compare);
for(int i=0;i<3;i++)
cout<<str[i]<<' ';
}
七、计算几何中求凸包的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;
}
c++中加载头文件 "iostream"
c中qsort函数包含在<stdlib.h>的头文件里,strcmp包含在<string.h>的头文件里
///////////////////////////////////////////////////
sort(a.begin(),a.end())
sort(p,p+N,cmp)
bool cmp(const int& a,const int& b)
{
return a<b;//升序排列
return a>b;//降序排列
}
///////////////////////////////////////////////////
三.qsort(a,n,sizeof(int),compare)
其中compare是指向函数的指针,应用如下:
int compare(const void*b,const void*c)
{
return *(int*)b-*(int*)c;
}
如果a为二维数组,即a[n][m],排序如下:
qsort(a,n,sizeof(int)*m,compare)
int compare(const void*b,const void*c)
{
reture ((int*)b)[0]-((int*)c)[0];
}
如果a是字符数组,排序如下;
qsort(a,strlen(a),sizeof(char),cmp);
int cmp(const void*b,const void*c)
{
return strcmp((char*)b,(char*)c);
}

本文详细介绍了C/C++中的qsort()函数用法,包括不同数据类型的排序示例,如int、char、double及结构体的排序,并提供了完整的示例代码。
403

被折叠的 条评论
为什么被折叠?



