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