qsort及其用法

来源:互联网 发布:linux设置文件为可写 编辑:程序博客网 时间:2024/05/12 02:05
qsort及其用法一、 函数原型voidqsort(void*base, size_t num, size_t width, int (__cdecl *compare )(constvoid*elem1, constvoid*elem2));大概的意思是,第一个参数指明了要排序的数组(比如:程序中的num),第二个参数给出了数组的大小(qsort没有足够的智力预知你传给它的数组的实际大小),第三个参数给出了数组中每个元素以字节为单位的大小。最后那个长长的家伙,给出了排序时比较元素的方式..再给一个例子:inta[n];qsort(a,n,sizeof(int),comp);//从小到大排序intcomp(constvoid*a,constvoid*b){int*x=(int*)a;int*y=(int*)b;return*x-*y; //如果a>b返回正数,如果a<b,返回负数,相等返回0;}二、 qsort用法1、对int类型数组排序intnum[100];Sample:intcmp(constvoid*a,constvoid*b){return*(int*)a-*(int*)b;}qsort(num,100,sizeof(num[0]),cmp);2、对char类型数组排序(同int类型)charword[100];Sample:intcmp(const void*a,constvoid*b){2return*(char*)a-*(int*)b;}qsort(word,100,sizeof(word[0]),cmp);3、对double类型数组排序(特别要注意)doublein[100];intcmp(const void*a,constvoid*b){return*(double*)a>*(double*)b?1:-1;}qsort(in,100,sizeof(in[0]),cmp);4、对结构体一级排序structIn{doubledata;intother;}s[100]//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写intcmp(const void*a,constvoid*b){return(*(In*)a)->data>(*(In*)b)->data?1:-1;}qsort(s,100,sizeof(s[0]),cmp);5、对结构体二级排序structIn{intx;inty;}s[100];//按照x从小到大排序,当x相等时按照y从大到小排序intcmp(const void*a,constvoid*b)3{structIn*c=(In*)a;structIn*d=(In*)b;if(c->x!=d->x)returnc->x-d->x;elsereturnd->y-c->y;}qsort(s,100,sizeof(s[0]),cmp);6、对字符串进行排序structIn{intdata;charstr[100];}s[100];//按照结构体中字符串str的字典顺序排序intcmp(constvoid*a,constvoid*b){returnstrcmp((*(In*)a)->str, (*(In*)b)->str);}qsort(s,100,sizeof(s[0]),cmp);自己写一个纯字符串的:(temp是二维的字符串数组,j是一共需排序的字符串个数)intcmpstr(constvoid*a,constvoid*b){returnstrcmp((char*)a,(char*)b);}qsort(temp,j,sizeof(temp[0]),cmpstr);7、计算几何中求凸包的cmpintcmp(constvoid*a,constvoid*b)//重点cmp函数,把除了1点外的所有点,旋转角度排序{4structpoint*c=(point*)a;structpoint*d=(point*)b;if(calc(*c,*d,p[1])<0)return1;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))//如果在一条直线上,则把远的放在前面return1;elsereturn-1;}qsort()是c程序库stdlib.h中的一个函数,需要比较函数完成排序;sort()是STL中的标准算法。#include<stdlib.h>intcmp(constvoid*a,constvoid*b){return*((int*)b)-*((int*)a);}...qsort(q,n,sizeof(int),cmp);...}qsort对一维数组和字符串数组的排序:#include"stdio.h"#include"stdlib.h"inta[100];intcmp(constvoid*p,constvoid*q){return(*(int*)p)-*((int*)q);}intmain(){int n;scanf("%d",&n);5for(int i=0;i<n;i++)scanf("%d",&a[i]);qsort((void*)a,n,sizeof(a[0]),cmp);for(int i=0;i<n;i++)printf("%d\n",a[i]);//while(1);intcmp(constvoid*p,constvoid*q){returnstrcmp((char*)p,(char*)q);}intmain()return0;}#include"stdio.h"#include"stdlib.h"#include"string.h"chara[20005][25];{int n,m,i,j;while(1){scanf("%d%d",&n,&m);if(n==0&&m==0)break;for(i=0;i<n;i++){scanf("%s",a[i]);}qsort((void*)a,n,sizeof(a[0]),cmp);for(i=0;i<n;i++)printf("%s\n",a[i]);}


原创粉丝点击