文章目录

  • 1有关qsort
  • 2,具体形式
  • 3、实例说明
  • 4、C++中sort用法以及和c中qsort的区别


1有关qsort

排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)

qsort函数声明如下:
void qsort(void * base,size_t nmemb,size_t size ,int(*compar)(const void *,const void *));
参数说明:
1 .base,要排序的数组
2、nmemb,数组中元素的数目
3、size,每个数组元素占用的内存空间,可使用sizeof函数获得
4、compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,第一个参数大于,等于,小于第二个参数时,分别显示正值,零,负值。

qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
  如比较函数 int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。

2,具体形式

一,对int型数组排序

int num[100];int cmp_int(const void* _a , const void* _b)  //参数格式固定{int* a = (int*)_a;    //强制类型转换int* b = (int*)_b;return *a - *b;  }qsort(num,100,sizeof(num[0]),cmp_int);

二,对字符型数组排序

char word[100];int cmp_char(const void* _a , const void* _b)  //参数格式固定{char* a = (char*)_a;    //强制类型转换char* b = (char*)_b;return *a - *b;  }qsort(word,100,sizeof(word[0]),cmp_cha

三。对double型数组排序

double in[100];int cmp_double(const void* _a , const void* _b)  //参数格式固定{double* a = (double*)_a;    //强制类型转换double* b = (double*)_b;return *a > *b ? 1 : -1;   //特别注意}qsort(in,100,sizeof(in[0]),cmp_doub

在对浮点或者double型的一定要用三目运算符,因为要是使用像整型那样相减的话,如果是两个很接近的数则可能返回一个很小的小数(大于-1,小于1),而cmp的返回值是int型,因此会将这个小数返回0,系统认为是相等,失去了本来存在的大小关系
四、对字符串数组排序

char word[100][10];int cmp_string(const void* _a , const void* _b)  //参数格式固定{char* a = (char*)_a;  //强制类型转换char* b = (char*)_b;return strcmp(a,b);}qsort(word,100,sizeof(word[0]),cmp_string);

3、实例说明

#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h> void main(void){int i;int a[10]={0,1,2,3,4,5,6,7,8,9};char b[10]={'a','b','c','d','e','f','g','h','i','j'};double c[10]={0.1,0.2,0.9,0.5,0.3,0.6,0.7,0.8,1.1,1.2};int cmp1(const void * a,const void * b){return (*(int*)a-*(int*)b);//a>b 返回正值} int cmp2(const void * a,const void *b){return(*(char*)a-*(char*)b);}int cmp3(const void * a,const void * b){if(fabs(*(double*)a-*(double *)b)<1*exp(-20))return 0;elsereturn(((*(double*)a-*(double*)b)>0)?1:-1);}qsort(a,10,sizeof(int),&cmp1);//对于函数指针(指向函数的指针),直接传入函数名或&函数名进行  //运算都是可以的,因为在调用函数时也是取的函数的地址qsort(b,10,sizeof(char),cmp2);qsort(c,10,sizeof(double),cmp3);for(i=0;i<10;i++)printf("%d ",a[i]);for(i=0;i<10;i++)printf("%c ",b[i]);for(i=0;i<10;i++)printf("%lf ",c[i]);}

4、C++中sort用法以及和c中qsort的区别

1、整形数据比较

bool cmp(int a,int b){return a < b;}int a[10];  sort(a,a+10,cmp);

2.实型数据比较

bool cmp(float a,float b){return a < b;}int a[10];  sort(a,a+10,cmp);

3,结构体类型比较
题目:有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息。题目链接

struct student{int grade;char name[101];int age;}stu[1001];bool cmp(student a,student b){int t = strcmp(a.name,b.name);if(a.grade != b.grade) return a.grade < b.grade; else if(t != 0)return t < 0; elsereturn a.age < b.age;}sort(stu,stu+n,cmp);

关于cmp函数参数中的&符号(转) 关于sort函数中的cmp函数有着不同的写法,以刚刚的整形元素比较为例
还有人是这么写的:

bool cmp(const int &a, const int &b){  return a>b;  }  int a[10];  sort(a,a+10,cmp);

思考:int 和const int&有什么区别呢?
原来:作为函数参数:int这种写法是值传递,const int&则是引用传递。 “值传递”——由于函数将自动产生临时变量用于复制该参数,效率较低。 “引用传递”仅借用一下参数的别名而已,不需要产生临时对象。效率较高。 tips:“引用传递”有可能改变参数,const修饰可以解决这个问题。

©著作权归作者所有:来自51CTO博客作者qq60751173d6bae的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 4.01模板字面量和标签函数
  2. 【博客大赛】浅析go切片与排序
  3. 【等待事件】User I/O类 等待事件(2.7)--direct path read/write t
  4. LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE转换--UTL_RAW、DBMS_STA
  5. 虚假软件更新滥用NetSupport远程访问工具
  6. 告别躺赢,我靠索引+函数
  7. 神奇的MySQL排序,我把面试者都问蒙了
  8. 说说sys_context函数
  9. 【DB笔试面试459】ORA-00904:

随机推荐

  1. JavaScript中的持续传递风格 [每日前端夜
  2. 【开发者必看】移动应用趋势洞察白皮书-
  3. 在模仿中精进数据可视化03:OD数据的特殊可
  4. 在模仿中精进数据可视化02:温室气体排放来
  5. 在pandas中使用数据透视表
  6. jupyter平台最强插件没有之一
  7. 推荐一个 Python 手绘图形库(附代码)
  8. Python中的yield到底是个什么鬼?
  9. 使用selenium自动秒抢淘宝商品(附详细入门
  10. 6个冷门但实用的pandas知识点