C语言qsort函数的简介和用法,保证简洁明了!
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• //按照结构体中字符串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()定义了两个const void(类型为空)的指针*a和*b; 在*(int *)a - *(int *)b; 这句中把指针强制转换为 int型; 我们可以将const void 改为你需要排序对象的类型; int num[100]; int cmp ( int *a , int *b ) { return *a - *b; } qsort(num,100,sizeof(num[0]),cmp); 如果要对num[100]中的元素从大到小排序,只需要将return *a - *b改为 return *b -*a 就可以实现;
qsort简单实例
• 应用qsort对int数组进行排序:
• #include <stdio.h>
• #include <stdlib.h>
• int cmp_1 ( int *a , int *b )
•{
• return *a - *b;
•}
• int cmp_2 ( int *a , int *b )
qsort简介
• qsort函数是ANSI C标准中提供的,其声明在 stdlib.h文件中,是根据二分发写的,其时间复杂 度为n*log(n),其结构为:
• void qsort(void *base,size_t nelem,size_t width, cmp);
• *base 为要排序的数组 • nelem 为要排序的数组的长度 • width 为数组元素的大小(一字节为单位) • 简单示例:对int num[100]排序,qsort中各参数
•
{
•
if(a->x != b->x)
•
return a->x - b->x; ////按照x从小到大排序,当x相等时按照y从大到小排序
•
else return a->y - b->y ;
•
}
•
void main()
•Hale Waihona Puke {•int sum=0,n;
•
int i,j;
•
freopen("in.txt","r",stdin);
•
printf("\n");
• • • • •}
qsort(num,10,sizeof(num[0]),cmp_2);//从大到小 for(i=0;i<10;i++)
printf("%d ",num[i]); printf("\n");
• 应用qsort对char数组进行排序:
• #include <stdio.h>
• Int Cmp(const void *a , const void *b )中有两个元素作为参数, 返回一个int值, 如果比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返 回小于零 qsort就认为 a<b 。
qsort 知道元素大小,就可以把大的放到前面去。
怎么写? • qsort(num,100,sizeof(num[0]),cmp);
自定义比较函数
• 比较函数的名字是自定义的(这里我们用CMP命名); • Cmp:qsort 要求提供的这个函数是一个需要自己定义的比较函
数,比较函数使得qsort通用性更好。有了比较函数qsort可以实 现对数组,字符串,结构体等结构进行升序或降序排序。
•
for(i=0;i<n;i++)
•
printf("%d %d ",data[i].x,data[i].y);
•
printf("\n");
•
qsort(data,n,sizeof(data[0]),cmp);
•
•
•
•
}
•}
• 输入:
•4
• 02
• 21
• 38
• 63
•0
for(i=0;i<n;i++) printf("%d %d ",data[i].x,data[i].y);
printf("%c ",ch[i]); printf("\n");
• 应用qsort对结构体一级排序:
• #include <stdio.h>
• #include <stdlib.h>
• struct coord
•{
•
int x;
•
int y;
• }data[100];
• int cmp(struct coord *a ,struct coord *b) //根据y的大小排序
•{
• return *b - *a;
•}
• void main()
•{
•
int num[10]={1,3,5,7,9,2,4,6,8,0};
•
int i;
•
qsort(num,10,sizeof(num[0]),cmp_1);//从小到大
•
for(i=0;i<10;i++)
•
printf("%d ",num[i]);
• #include <stdlib.h>
• int cmp_1 ( char *a , char *b )
•{
• return *a - *b;
•}
• int cmp_2 ( char *a , char *b )
•{
• return *b - *a;
•}
• void main()
•{
•
char ch[10]={"bcadfegihj"};
•
int i;
•
qsort(ch,10,sizeof(ch[0]),cmp_1);//从小到大
•
for(i=0;i<10;i++)
•
printf("%c ",ch[i]);
•
printf("\n");
• • • • •}
qsort(ch,10,sizeof(ch[0]),cmp_2);//从大到小 for(i=0;i<10;i++)
C函数qsort的简介和用法
BY:SMJUN
C函数qsort实现快速排序
排序方法有很多种:选择排序,冒泡排序, 归并排序,快速排序等。
看名字都知道快速排序 是目前公认的一种 比较好的排序算法,比选择排序,冒泡排 序都要快。因为它的速度很快,所以系统 也在库里实现这个算法,便于我们的使用。
这就是qsort。
• strcmp包含在<string.h>的头文件里
END
printf("\n");
• 应用qsort对结构体二级排序:
•
#include <stdio.h>
•
#include <stdlib.h>
•
struct coord
•
{
•
int x;
•
int y;
•
}data[100];
•
int cmp(struct coord *a ,struct coord *b)
•{
•
return a->y - b->y ;
•}
• void main()
•{
•
int sum=0,n;
•
int i,j;
•
//freopen("in.txt","r",stdin);
•
while(scanf("%d",&n)!=EOF&&n)
•
{
•
for(i=0;i<n;i++)
•
scanf("%d %d",&data[i].x,&data[i].y);
如果你的比较函数放回本来应该是1 的(a>b),你比较函数却返 回一个 -1 (小于零的)那么qsort认为a<b 的,就把 b放到前面 去,但实际上是a大于b的,所以就造成升降序的差别了。 • 简单来说,比较函数的作用就是给qsort指明元素的大小是怎么 比较的。
简单示例:对int num[100]中的元素从小到大排序。 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; //强制转换类型 } qsort(num,100,sizeof(num[0]),cmp);
•
qsort(data,n,sizeof(data[0]),cmp);
•
•
•
•
}
•
}
•
输入:
•
5
•
22
•
21
•
43
•
39
•
42
•
0
for(i=0;i<n;i++) printf("%d %d ",data[i].x,data[i].y);
printf("\n");
• 对字符串排序(简单了解): • struct In •{ • int data; • char str[100]; • }s[100];
•
while(scanf("%d",&n)!=EOF&&n)
•
{
•
for(i=0;i<n;i++)
•
scanf("%d %d",&data[i].x,&data[i].y);
•
for(i=0;i<n;i++)
•
printf("%d %d ",data[i].x,data[i].y);
•
printf("\n");
• int cmp ( const void *a , const void *b ) •{ • return strcmp( (*(In *)a)->str , (*(In *)b)->str ); •}
• qsort(s,100,sizeof(s[0]),cmp);
Cmp()定义了两个const void(类型为空)的指针*a和*b; 在*(int *)a - *(int *)b; 这句中把指针强制转换为 int型; 我们可以将const void 改为你需要排序对象的类型; int num[100]; int cmp ( int *a , int *b ) { return *a - *b; } qsort(num,100,sizeof(num[0]),cmp); 如果要对num[100]中的元素从大到小排序,只需要将return *a - *b改为 return *b -*a 就可以实现;
qsort简单实例
• 应用qsort对int数组进行排序:
• #include <stdio.h>
• #include <stdlib.h>
• int cmp_1 ( int *a , int *b )
•{
• return *a - *b;
•}
• int cmp_2 ( int *a , int *b )
qsort简介
• qsort函数是ANSI C标准中提供的,其声明在 stdlib.h文件中,是根据二分发写的,其时间复杂 度为n*log(n),其结构为:
• void qsort(void *base,size_t nelem,size_t width, cmp);
• *base 为要排序的数组 • nelem 为要排序的数组的长度 • width 为数组元素的大小(一字节为单位) • 简单示例:对int num[100]排序,qsort中各参数
•
{
•
if(a->x != b->x)
•
return a->x - b->x; ////按照x从小到大排序,当x相等时按照y从大到小排序
•
else return a->y - b->y ;
•
}
•
void main()
•Hale Waihona Puke {•int sum=0,n;
•
int i,j;
•
freopen("in.txt","r",stdin);
•
printf("\n");
• • • • •}
qsort(num,10,sizeof(num[0]),cmp_2);//从大到小 for(i=0;i<10;i++)
printf("%d ",num[i]); printf("\n");
• 应用qsort对char数组进行排序:
• #include <stdio.h>
• Int Cmp(const void *a , const void *b )中有两个元素作为参数, 返回一个int值, 如果比较函数返回大于0,qsort就认为 a>b , 如果比较函数返回等于0 qsort就认为a 和b 这两个元素相等,返 回小于零 qsort就认为 a<b 。
qsort 知道元素大小,就可以把大的放到前面去。
怎么写? • qsort(num,100,sizeof(num[0]),cmp);
自定义比较函数
• 比较函数的名字是自定义的(这里我们用CMP命名); • Cmp:qsort 要求提供的这个函数是一个需要自己定义的比较函
数,比较函数使得qsort通用性更好。有了比较函数qsort可以实 现对数组,字符串,结构体等结构进行升序或降序排序。
•
for(i=0;i<n;i++)
•
printf("%d %d ",data[i].x,data[i].y);
•
printf("\n");
•
qsort(data,n,sizeof(data[0]),cmp);
•
•
•
•
}
•}
• 输入:
•4
• 02
• 21
• 38
• 63
•0
for(i=0;i<n;i++) printf("%d %d ",data[i].x,data[i].y);
printf("%c ",ch[i]); printf("\n");
• 应用qsort对结构体一级排序:
• #include <stdio.h>
• #include <stdlib.h>
• struct coord
•{
•
int x;
•
int y;
• }data[100];
• int cmp(struct coord *a ,struct coord *b) //根据y的大小排序
•{
• return *b - *a;
•}
• void main()
•{
•
int num[10]={1,3,5,7,9,2,4,6,8,0};
•
int i;
•
qsort(num,10,sizeof(num[0]),cmp_1);//从小到大
•
for(i=0;i<10;i++)
•
printf("%d ",num[i]);
• #include <stdlib.h>
• int cmp_1 ( char *a , char *b )
•{
• return *a - *b;
•}
• int cmp_2 ( char *a , char *b )
•{
• return *b - *a;
•}
• void main()
•{
•
char ch[10]={"bcadfegihj"};
•
int i;
•
qsort(ch,10,sizeof(ch[0]),cmp_1);//从小到大
•
for(i=0;i<10;i++)
•
printf("%c ",ch[i]);
•
printf("\n");
• • • • •}
qsort(ch,10,sizeof(ch[0]),cmp_2);//从大到小 for(i=0;i<10;i++)
C函数qsort的简介和用法
BY:SMJUN
C函数qsort实现快速排序
排序方法有很多种:选择排序,冒泡排序, 归并排序,快速排序等。
看名字都知道快速排序 是目前公认的一种 比较好的排序算法,比选择排序,冒泡排 序都要快。因为它的速度很快,所以系统 也在库里实现这个算法,便于我们的使用。
这就是qsort。
• strcmp包含在<string.h>的头文件里
END
printf("\n");
• 应用qsort对结构体二级排序:
•
#include <stdio.h>
•
#include <stdlib.h>
•
struct coord
•
{
•
int x;
•
int y;
•
}data[100];
•
int cmp(struct coord *a ,struct coord *b)
•{
•
return a->y - b->y ;
•}
• void main()
•{
•
int sum=0,n;
•
int i,j;
•
//freopen("in.txt","r",stdin);
•
while(scanf("%d",&n)!=EOF&&n)
•
{
•
for(i=0;i<n;i++)
•
scanf("%d %d",&data[i].x,&data[i].y);
如果你的比较函数放回本来应该是1 的(a>b),你比较函数却返 回一个 -1 (小于零的)那么qsort认为a<b 的,就把 b放到前面 去,但实际上是a大于b的,所以就造成升降序的差别了。 • 简单来说,比较函数的作用就是给qsort指明元素的大小是怎么 比较的。
简单示例:对int num[100]中的元素从小到大排序。 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; //强制转换类型 } qsort(num,100,sizeof(num[0]),cmp);
•
qsort(data,n,sizeof(data[0]),cmp);
•
•
•
•
}
•
}
•
输入:
•
5
•
22
•
21
•
43
•
39
•
42
•
0
for(i=0;i<n;i++) printf("%d %d ",data[i].x,data[i].y);
printf("\n");
• 对字符串排序(简单了解): • struct In •{ • int data; • char str[100]; • }s[100];
•
while(scanf("%d",&n)!=EOF&&n)
•
{
•
for(i=0;i<n;i++)
•
scanf("%d %d",&data[i].x,&data[i].y);
•
for(i=0;i<n;i++)
•
printf("%d %d ",data[i].x,data[i].y);
•
printf("\n");