C/C++ qsort()快速排序的用法

来源:互联网 发布:淘宝投诉编号在哪里看 编辑:程序博客网 时间:2024/06/05 17:13

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