快排模板
以下是其具體分類及用法(若無具體說明是以降序排列):
1、對(duì)一維數(shù)組排序:
(Element_type是一位數(shù)組中存放的數(shù)據(jù)類型,可以是char, int, float, double, etc )
使用qsort之前,必須自己定義一個(gè)比較函數(shù)。這個(gè)比較函數(shù)用于比較兩個(gè)元素的大小。由于qsort可以排序任意數(shù)據(jù)類型,包括自定義的結(jié)構(gòu)類型,因此,做一個(gè)自定義的比較函數(shù)是必要的。
int Comp(const void *p1,const void *p2 )
{
???? return *((Element_type *)p2) > *((Element_type *)p1) ? 1 : -1;
}
int main()
{
Element_type list[MAX];
initial(list);
qsort(list, sizeof(list),sizeof(Element_type),Comp); // qsort的4個(gè)參數(shù):數(shù)組的首地址、數(shù)組的實(shí)際大小,元素的實(shí)際大小,比較函數(shù)
return 0;
}
2、對(duì)字符串排序:
int Comp(const void *p1,const void *p2)
{
return strcmp((char *)p2,(char *)p1);
}
int main()
{
char a[MAX1][MAX2];
initial(a);
qsort(a,lenth,sizeof(a[0]),Comp);
//lenth 為數(shù)組a的長(zhǎng)度
3、按結(jié)構(gòu)體中某個(gè)關(guān)鍵字排序(對(duì)結(jié)構(gòu)體一級(jí)排序):
struct Node
{
double data;
int other;
}s[100];
int Comp(const void *p1,const void *p2)
{
return (*(Node *)p2)->data > (*(Node *)p1)->data ? 1 : -1;
}
qsort(s,100,sizeof(s[0]),Comp);
4、按結(jié)構(gòu)體中多個(gè)關(guān)鍵字排序(對(duì)結(jié)構(gòu)體多級(jí)排序)[以二級(jí)為例]:
struct Node
{
int x;
int y;
}s[100];
//按照x從小到大排序,當(dāng)x相等時(shí)按y從大到小排序
int Comp(const void *p1,const void *p2)
{
struct Node *c = (Node *)p1;
struct Node *d = (Node *)p2;
if(c->x != d->x) return c->x-d->x;
else return d->y - c->y;
}
5、對(duì)結(jié)構(gòu)體中字符串進(jìn)行排序:
struct Node
{
int data;
char str[100];
}s[100];
//按照結(jié)構(gòu)體中字符串 str 的字典序排序
int Comp(const void *p1,const void *p2)
{
return strcmp((*(Node *)p1).str,(*(Node *)p2).str);
}
qsort(s,100,sizeof(s[0],Comp);
6、計(jì)算幾何中求凸包的Comp
//以下是俺從別人那兒抄來的,暫時(shí)還沒用過
int Comp(const void *p1,const void *p2)
//重點(diǎn)Comp函數(shù),把除了1點(diǎn)外的所有的點(diǎn)旋轉(zhuǎn)角度排序
{
struct point *c=(point *)p1;
struct point *d=(point *)p2;
if( cacl(*c, *d,p[1]) < 0) return 1;
else if(!cacl(*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 ) )
//如果在一條直線上,則把遠(yuǎn)的放在前面
return 1;
else return -1;
}
P.S.:qsort函數(shù)是ANSI C標(biāo)準(zhǔn)中提供的,其聲明在stdlib.h文件中,是根據(jù)二分發(fā)寫的,其時(shí)間復(fù)雜度為n*log(n),其結(jié)構(gòu)為:
void qsort(void *base,size_t nelem,size_t width,int (*Comp)(const void *,const void *));
其中:
*base 為要排序的數(shù)組
nelem 為要排序的數(shù)組的長(zhǎng)度
width 為數(shù)組元素的大小(一字節(jié)為單位)
(* Comp)(const void *p1,const void *p2) 為判斷大小函數(shù)的指針,這個(gè)函數(shù)需要自己定義,如果p1>p2,函數(shù)返回-1;a<b,函數(shù)返回1;a==b函數(shù)返回0。
轉(zhuǎn)載于:https://www.cnblogs.com/biying/archive/2013/04/19/3031568.html
總結(jié)
- 上一篇: Entity Framework 的 e
- 下一篇: How to Export Mailbo