sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件;

qsort()是C中的排序函数,其头文件为:#include<stdlib.h>

   qsort()----六类qsort排序方法                                                  

qsort函数很好用,但有时不太会用比如按结构体一级排序、二级排序、字符串排序等。

函数原型:

void qsort(void *base, size_t nelem, size_t width, int (*fcmp)(const void*,const void *))

输入参数:

Base待排序的数组

nelem数组元数的个数(长度)

width每一个元素所占存储空间的大小

fcmp用于对数组元素进行比较的函数的指针(该函数是要自己写的),返回值为1或-1(p1>p2则返回-1,p1<p2则返回1,p1==p2则返回0),size_t是int

输出参数:base 以升序排列

以下是其具体分类及用法(若无具体说明是以降序排列):

(1)对一维数组排序:

(Element_type 是一位数组中存放的数据类型,可以是char,int,float,double,ect)

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);//这是对数组list[max]初始化

qsort(list, sizeof(list),sizeof(Element_type),Comp);//调用函数qsort

return 0;

}

(2)对字符串排序:

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 为数组a的长度

}

(3)按结构体中某个关键字排序(对结构体一级排序):

typedef struct Node

{

double data;

int other;

}Node;

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)按结构体中多个关键字排序(对结构体多级排序)[以二级为例]:

struct Node

{

int x;

int y;

}s[100];

//按照x从小到大排序,当x相等时按y从大到小排序(这是3跟4的区别)

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)对结构体中字符串进行排序:

struct Node

{

int data;

char str[100];

}s[100];

//按照结构体中字符串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)计算几何中求凸包的Comp

int Comp(const void *p1,const void *p2)//重点Comp函数,把除了1点外的所有的点旋转角度排序

{

struct point *c=(point *)p1;

struct point *d=(point *)p2;

if( cacl(*c, *d,p[1])<0)

return 1;

elseif(!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))

//如果在一条直线上,则把远的放在前面

return 1;

else

return -1;

}

   sort()函数用法                                             

sort 对给定区间所有元素进行排序

stable_sort 对给定区间所有元素进行稳定排序

partial_sort 对给定区间所有元素部分排序

partial_sort_copy 对给定区间复制并排序

nth_element 找出给定区间的某个位置对应的元素

is_sorted 判断一个区间是否已经排好序

partition 使得符合某个条件的元素放在前面

stable_partition 相对稳定的使得符合某个条件的元素放在前面

语法描述为:

(1)sort(begin,end),表示一个范围,例如:

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按升序排序,说到这里可能就有人会问怎么样用它降序排列呢?这就是下一个讨论的内容。

(2)sort(begin,end,compare)

一种是自己编写一个比较函数来实现,接着调用三个参数的sort:sort(begin,end,compare)就成了。对于list容器,这个方法也适用,把compare作为sort的参数就可以了,即:sort(compare)。

1)自己编写compare函数:

bool compare(int a,int b)

{

return a<b; //升序排列,如果改为return a>b,则为降序

}

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,compare);

for(i=0;i<20;i++)

cout<<a[i]<<endl;

return 0;

}

2)更进一步,让这种操作更加能适应变化。也就是说,能给比较函数一个参数,用来指示是按升序还是按降序排,这回轮到函数对象出场了。

为了描述方便,我先定义一个枚举类型EnumComp用来表示升序和降序。很简单:

enum Enumcomp{ASC,DESC};

然后开始用一个类来描述这个函数对象。它会根据它的参数来决定是采用“<”还是“>”。

class compare

{

private:

Enumcomp comp;

public:

compare(Enumcomp c):comp(c) {};

bool operator () (int num1,int num2)

{

switch(comp)

{

case ASC:

return num1<num2;

caseDESC:

return num1>num2;

}

}

};

接下来使用sort(begin,end,compare(ASC))实现升序,sort(begin,end,compare(DESC))实现降序。

主函数为:

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;

}

3)其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在functional里,include进来就行了。functional提供了一堆基于模板的比较函数对象。它们是(看名字就知道意思了):equal_to<Type>、not_equal_to<Type>、greater<Type>、greater_equal<Type>、less<Type>、less_equal<Type>。对于这个问题来说,greater和less就足够了,直接拿过来用:

升序: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;

}

4)既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:

int main()

{

string str("cvicses");

string s(str.rbegin(),str.rend());

cout << s <<endl;

return 0;

}

转自百度文库,觉得很实用,所以自己留个备份:http://wenku.baidu.com/view/667c03c10c22590102029d7a.html

qsort()与sort的用法(收藏)相关推荐

  1. 【慢慢学算法】:qsort()与sort的用法(收藏)

    sort()函数是C++中的排序函数其头文件为:#include<algorithm>头文件: qsort()是C中的排序函数,其头文件为:#include<stdlib.h> ...

  2. Shell Sort 希尔排序 收藏

    Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...

  3. asp.net application,session,static 几种变量生命周期及用法 收藏

    asp.net application,session,static 几种变量生命周期及用法 收藏 Application 是应用程序级变量,如果用到多个用户之间的通信的时候用,多用在网站计算器等,存 ...

  4. matlab sort descend,详解Matlab中 sort 函数用法

    搜索热词 (1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序. eg: A=[1,5,3],则sort(A)=[1,3,5] A=[1,3; ...

  5. sort函数用法python_python内置函数sorted()及sort() 函数用法和区别

    python内置函数sorted(),sort()都有排序的意思,但是两者有本质的区别,sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作,list 的 sort ...

  6. sort在c语言中的作用,c语言中sort的用法详解.docx

    c语言中sort的用法详解.docx C语言中SORT的用法详解C语言的学习很多是比较复杂的,那么C语言中SORT的用法的用法你知道吗下面学习啦小编就跟你们详细介绍下C语言中SORT的用法的用法,希望 ...

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

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

  8. java sort方法用法

    java sort方法用法 一.单条件排序 默认升序 // 根据某个参数排序list.sort(Comparator.comparing(User::getId)); 倒序 // 根据某个参数排序li ...

  9. sort函数降序排列matlab,详解Matlab中 sort 函数用法

    (1)B=sort(A) 对一维或二维数组进行升序排序,并返回排序后的数组,当A为二维时,对数组每一列进行排序. eg: A=[1,5,3],则sort(A)=[1,3,5] A=[1,5,3;2,4 ...

最新文章

  1. Blender终极角色创造:从初学者到专业人士
  2. JavaScript基础3——关于运算符
  3. 升级win10的理由
  4. java多线程notifyall_Java多线程:线程状态以及wait(), notify(), notifyAll()
  5. 二、Python安装扩展库
  6. [vue-cli]vue-cli默认是单页面的,那要弄成多页面该怎么办呢
  7. 微软公司等数据结构+算法面试100题2010版全部出炉
  8. 二本非科班30岁转行架构师的老徐:站在巨人的肩膀学习才是捷径
  9. Redis如何实现刷抖音不重复-布隆过滤器(Bloom Filter)
  10. memcpy memmove区别和实现
  11. cms核心功能_如何根据这些重要功能选择合适的CMS
  12. linux下golang编译环境搭建
  13. thymeleaf中的th:assert用法
  14. android 自定义ratingbar 图片显示不全的解决方案
  15. 提升SQLite数据插入效率低、速度慢的方法
  16. 为戴尔服务器下载ESXi
  17. java中文getbytes为3_Java getBytes方法详解(字符集问题)
  18. iOS 去除字符串中的H5标签
  19. 跨境电子商务( Cross-Border Electronic Commerce )是什么?
  20. Android点阵屏效果的控件

热门文章

  1. Nginx学习笔记---ngx_buf_t数据结构
  2. Linux帮助信息获取
  3. 在apache访问日志中统计统计前十名pv
  4. The property delegate of CALayer cause Crash.
  5. Ogre wiki 中级教程1 动画,点之间行走及四元数的基本应用
  6. 常见多媒体文件格式及视音频编解码总结
  7. pyqt界面屏幕分辨率自适应_后台系统界面设计踩过的那些坑
  8. 大疆精灵2v+怎么连接手机_车载蓝牙播放器怎么用,手机蓝牙怎么连接车载蓝牙放音乐...
  9. Ribbon-饥饿加载
  10. Nginx负载均衡策略之轮询与加权轮询