一、qsort()函数

原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*));

参数解释:1、待排序数组首地址;2、数组中待排序元素数量;3、各元素的占用空间的大小;4、指向函数的指针,用于确定排序的顺序。

说明:qsort函数是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,时间复杂度为O(n*logn)。

qsort要求提供比较函数用来确定排序的顺序(升序、降序),比较函数使得qsort通用性更好,可以对数组、字符串、结构体数进行排序。如int cmp(const void *a, const void *b)中有两个元素作为参数(参数的格式不能变的。)返回一个int值,如果比较函数返回大于0,qsort就认为a > b,返回小于0,qsort就认为a < b。

1、qsort中几种常见的cmp函数

1.1、对int类型数组排序

int num[100];
int cmp(const void *a, const void *b)
{return *(int *)a - *(int *)b;
}qsort(num, 100, sizeof(int), cmp);

1.2、对char类型数组排序

char num[100];
int cmp(const void *a, const void *b)
{return *(char *)a - *(char *)b;
}qsort(num, 100, sizeof(char), cmp);

1.3、对double类型数组排序

double num[100];
int cmp(const void *a, const void *b)
{return *(double *)a > *(double *)b;
}qsort(num, 100, sizeof(double), cmp);

1.4、对结构体数组一级排序

struct In
{double data;int other;
}s[100]
//按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写
int cmp( const void *a ,const void *b)
{return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1;
}qsort(s,100,sizeof(In),cmp); 

1.5、对结构体数组二级排序

struct In
{int x;int y;
}s[100];
//按照x从小到大排序,当x相等时按照y从大到小排序
int cmp( const void *a , const void *b )
{struct In *c = (In *)a;struct In *d = (In *)b;if(c->x != d->x) return c->x - d->x;elsereturn d->y - c->y;
}qsort(s,100,sizeof(In),cmp);       

1.6、对字符串进行排序

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 );
}
qsort(s,100,sizeof(In),cmp); 

1.7、计算几何中求凸包的cmp

int cmp(const void *a,const void *b) //重点cmp函数,把除了1点外的所有点,旋转角度排序
{struct point *c=(point *)a;struct point *d=(point *)b;if( calc(*c,*d,p[1]) < 0)     return 1;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)) //如果在一条直线上,则把远的放在前面 return 1;else     return -1;
}

2、拓展知识点

one、为啥子使用qsort函数要指定排序元素的大小?

ans:这是个脑残的问题,给个脑残的答案吧。因为qsort需要根据元素的大小来进行排序。

two、 所使用的比较函式接受的是 const void* 类型?

ans:因为考虑到qsort的通用性,这样可以对数组,结构体数组等类型进行排序了。

二、sort()函数

函数名 功能描述
sort 对给定区间所有元素进行排序
stable_sort 对给定区间所有元素进行稳定排序
partial_sort 对给定区间所有元素部分排序
partial_sort_copy 对给定区间复制并排序
nth_element 找出给定区间的某个位置对应的元素
is_sorted 判断一个区间是否已经排好序
partition 使得符合某个条件的元素放在前面
stable_partition 相对稳定的使得符合某个条件的元素放在前面

要使用上述函数必须加上头文件algorithm。

1、sort(begin,end)

小例子

#include<algorithm>int _tmain(int argc, _TCHAR* argv[])
{int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20);for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;
}    

输出结果是把数组a按升序排序,也就是sort函数的排序默认是升序的。

如何使用sort函数降序排序,ok!就像qsort中一样,我们需要自定义一个比较函数cmp(返回值为bool类型)。

2、重载的sort函数-带比较函数的sort(begin,end,cmp)

定义比较函数的方法

2.1、常用方法

下面的比较函数可以实现降序排序:

bool cmp(int a,int b)
{return a>b;
}

2.2、使用枚举类型enum来定义升序或者降序排序。

//ASC升序,DESC降序
enum Cmp{ASC,DESC};

2.3 定义一个比较类,来描述排序的顺序。

class compare
{private:Cmp comp;public:compare(Cmp c):comp(c) {};bool operator () (int num1,int num2) {switch(comp){case ASC:return num1<num2;case DESC:return num1>num2;}}
};

测试一下:

int main()
{int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20,compare(DESC));for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;
}

了解一下即可,因为比较麻烦,根据实际情况使用。

2.4、使用functional头文件中的比较对象。

functional提供了一堆基于模板的比较函数对象。equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这些比较对象,我们可以望文生义就知道它们的意思了。

for example:

sort(begin,end,less<data-type>();//升序

sort(begin,end,greater<data-type>();//降序

接着上面的例子,使用一下比较对象

int _tmain(int argc, _TCHAR* argv[])
{int a[20]={2,4,1,23,5,76,0,43,24,65},i;for(i=0;i<20;i++)cout<<a[i]<<endl;sort(a,a+20,greater<int>());for(i=0;i<20;i++)cout<<a[i]<<endl;return 0;
}

三、qsort函数和sort函数的PK。

1、cmp函数不同

返回值类型不同,qsort函数的cmp返回值类型为int,sort函数的cmp返回值为bool。

参数不同,sort函数的cmp可以直接是参与比较的引用类型,而qsort是严格的空指针类型。

比较表达式不同,qsort中的cmp使用的是“-”号,而sort中的cmp使用的是“>”。

2、性能的区别

sort函数是c++中标准模板库的的函数,在qsort()上已经进行了优化,根据情况的不同可以采用不同的算法,所以较快。在同样的元素较多和同样的比较条件下,sort()的执行速度都比qsort()要快。另外,sort()是类属函数,可以用于比较任何容器,任何元素,任何条件。

C中的qsort函数和C++中的sort函数的理解与使用相关推荐

  1. c语言sort函数的使用方法,Perl Sort函数用法总结和使用实例

    一) sort函数用法 sort LIST sort BLOCK LIST sort SUBNAME LIST sort的用法有如上3种形式.它对LIST进行排序,并返回排序后的列表.假如忽略了SUB ...

  2. 计算机中用函数排序,编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出。...

    编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出. 重赏重赏 更新时间:2019-05-06 04:06 最满意答案 #include ...

  3. 排序算法 | sort函数的使用

    除了我们自己写的排序算法:冒泡排序.选择排序等,C语言中提供了库函数qsort或者C++中提供了sort函数可以直接调用进行排序.考虑到qsort函数的使用需要用到指针,且写法上也没有sort函数简洁 ...

  4. 布尔类型(bool) 比较器 及sort函数C/C++语言调用

    一:布尔类型 1.1 在说比较器前,先说说布尔类型(bool),因为比较器需要借助布尔类型来实现. 布尔类型的变量只有两个值:true 和 false,即非真即假,一般零为假,非零为真.bool类型也 ...

  5. sort函数的基本使用

    sort函数是C++中STL(标准模板库)头文件<algorithm>中的一个函数,主要用于对数组或向量等容器进行排序.在计算机程序设计中,排序是一项基本的操作,可以帮助我们更方便地进行查 ...

  6. C++的sort函数如何实现从大到小排序

    C++的sort函数如何实现从大到小排序 一.sort的基本用法 1. 所在的头文件 2. 包含的参数 3. 时间复杂度 二.具体示例 [USACO07DEC\]Bookshelf B 题目描述 输入 ...

  7. C++ Sort函数详解

    C++ Sort函数详解 前言 :sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使用 ...

  8. c++fabs函数_C语言中常用的标准库函数有哪些?

    点击上方蓝色字关注我们! 本文转自网络,版权归原作者所有. 标准头文件包括: 一.标准定义() 文件里包含了标准库的一些常用定义,无论我们包含哪个标准头文件,都会被自动包含进来. 这个文件里定义: 类 ...

  9. C/C++中关于qsort的使用

    C/C++中有一个快速排序的标准库函数 qsort ,在stdlib.h 中声明,其原型为: void qsort(void *base, int nelem, unsigned int width, ...

最新文章

  1. 做项目遇到问题 2 AWS NLP 剽窃RuntimeError: size mismatch, m1: [10 x 3], m2: [2 x 10]检测部署报错
  2. 由谈退格键的实现来学习字符编码
  3. 编写android服务
  4. 计算机管理学科,计算机学院学科经费使用与管理细则(试行)
  5. int类型的实参与int*类型的形参不兼容_谁告诉的你们Python是强类型语言!站出来,保证不打你!...
  6. 如何将一个PDF文件里的图片批量导出
  7. java学习笔记之数组
  8. 手把手教你写一个微信小程序日历组件
  9. 神州数码否认买下华为荣耀,股价连续第二日涨停,创历史新高!
  10. NLP之路-python爬虫
  11. 程序员怒了!你敢削减专利奖金,我敢拒绝提交代码!
  12. obs多推流地址_什么都比不上动手能力,OBS 推流实践小记
  13. 卷积神经网络发展简史
  14. php微信二次分享出错,解决微信二次分享bug
  15. 如何使用Tuxera NTFS for Mac禁用特定NTFS分区
  16. SpringMVC学习(二)使用注解开发SpringMVC
  17. rocketmq概念
  18. 软件测试管理的基本要素
  19. Oracle开窗函数
  20. Win10问题篇:一次性永久关闭win10系统自动更新

热门文章

  1. hibernate.cfg.xml详细配置
  2. node.js学习5--------------------- 返回html内容给浏览器
  3. 国贫县山西永和:“一揽子”保险“保”脱贫
  4. 发布开源框架到CocoaPods入坑指南
  5. 网页图片缩放的深入剖析
  6. PHP中MD5函数漏洞
  7. window.open的小技巧分享(转)
  8. android-sdk-windows版本号下载
  9. 虚拟机VMWare“提示:软件虚拟化与此平台上的长模式不兼容”的解决方法
  10. 一个mongosee例子