一、sort()函数的使用

使用sort()函数的时候要加上头文件#include<algorithm>和using namespace std。
这个函数接收两个或者三个参数。
第一个参数是区间的首地址,第二个参数是区间尾地址的下一个地址,也就是说排序的区间是[a,b).

简单说就是对于int a[len],要对a[0]到a[len-1]进行排序,调用sort(a,a+len)即可。默认的是升序。

排序的数据类型不局限于整数,只要定义了小于运算的类型都是可以的,如string。

如果没有定义小于运算的数据类型,或者改变一下排序的规则,这个时候就要使用第三个参数--比较函数。 
比较函数是用户自定义的函数,返回bool类型,这个函数规定了用户自定义的“小于”如果想进行降序排列,如下:
bool cmp(int a,int b)
{
    return a>b;
}
sort(a,a+len,cmp)


例子:有一个node类型的数组node arr[100],想对其按照如下规则进行排序:
先按a的值升序排序,如果a的值相同,在按b的值降序排序,如果b还相同,就按c的值降序排序。那么cmp()函数为:
struct node
{
    int a;
    int b;
    double c;
}

bool cmp(node x,node y)
{
    if(x.a!=y.a)            return x.a<y.a;
    else if(x.b!=y.b)     return x.b>y.b
    else if(x.c!=x.c)      return x.c>y.c;
}
sort(arr,arr+100,cmp);




二、qsort()函数的使用
qsort()是C中的排序函数,其头文件是#include<stdio.h>
sort()是C++中的排序函数,其头文件是#include<algorithm>

函数原型:
void  qsort( void *base, size_t num, size_t width, int (__cdecl *cmp ); int  cmp (const void *elem1, const void *elem2 ) ); 

参数意义:
base:需要排序的目标数组开始地址
num:目标数组元素个数
width:目标数组中每一个元素的长度
cmp:函数指针,指向比较函数


1、对int类型数组排序
int num[100];
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
qsort(num,100,sizeof(num[0]),cmp);


2、对char类型数组排序
char word[100];
int cmp(const void *a,const void *b)
{
    return *(char *)a-*(char *)b;
}
qsort(word,100,sizeof(word[0]),cmp);


3、对double类型数组排序
double in[100];
int cmp(const void *a,const void *b)
{
    return *(double *)a>*(double *)b?1:-1;
}
qsort(in,100,sizeof(in[0]),cmp);


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


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;  
    else 
        return d->y - c->y;  
}  
qsort(s,100,sizeof(s[0]),cmp);  


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(s[0]),cmp);  



5、计算几何中凸包的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;  
}

关于排序--sort()和qsort()使用的更多相关文章

  1. 排序sort与qsort

    首先看sort函数见下表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 par ...

  2. 转:详细解说 STL 排序(Sort)

    详细解说 STL 排序(Sort) 详细解说 STL 排序(Sort) 作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1. ...

  3. 详细解说 STL 排序(Sort)(转)

    作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sor ...

  4. stl sort和qsort的使用

    好不容易使用了下stl的qsort函数,顺便和sort函数一起总结下: 很多时候我们都需要用到排序. 例如: 1 #include <iostream> #include <algo ...

  5. C++中sort()及qsort() (不完整介绍)

    在平时刷算法题和oj的时候,排序算法是最经常用到的算法之一:且在各类算法书的目录中 也通常是将各种排序算法放在最前面来讲,可见排序算法的重要性.可能许多人都在算法书中有学过冒泡.快速排序的方法,也都大 ...

  6. 算法学习笔记——sort 和 qsort 提供的快速排序

    这里存放的是笔者在学习算法和数据结构时相关的学习笔记,记录了笔者通过网络和书籍资料中学习到的知识点和技巧,在供自己学习和反思的同时为有需要的人提供一定的思路和帮助. 从排序开始 基本的排序算法包括冒泡 ...

  7. Lucene 排序 Sort与SortField

    在sql语句中,有升序和降序排列.在Lucene中,同样也有. Sort里的属性 SortField里的属性 含义 Sort.INDEXORDER SortField.FIELD_DOC 按照索引的顺 ...

  8. sort 与 qsort

    很长一段时间搞不明白 sort 和 qsort 的区别,平时在写程序时习惯了使用 sort ,因为它用起来比 qsort 要简单的多 , 这里详细介绍一下 sort 与 qsort : 给出一个数组 ...

  9. 设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

    模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(tem ...

随机推荐

  1. 6_再次开中断STI的正确姿势

    1 直接开启sti --蓝屏 2 配置环境 正确开启sti 中断 kpcr -- 很多重要线程切换的数据.结构 进入内核的时候 fs 不再是teb/tib: 是kpcr. 同时观察 kifastcal ...

  2. CSIC_716_20191108【文件的操作,以及彻底解决编码问题的方案】

    关于编码的问题: 在平时编写代码,涉及到打开文件时,常常遇到字符编码的报错, 通过总结,得出以下规律  如果在操作过程中涉及到调用文本文档,一定要在文本文档开头申明编码方式(# coding:XXXX ...

  3. node---处理get请求

    const http=require('http') const querystring=require('querystring') const server = http.createServer ...

  4. leetcode-219-存在重复元素②

    题目描述: 第一次提交:超时 class Solution: def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool ...

  5. DelphiHookApi(经典)

    论坛里有关于HOOK API的贴子, 但其实现在方式显示得麻烦, 其实现在拦截API一般不用那种方式, 大都采用inline Hook API方式.其实也就是直接修改了要拦截的API源码的头部,让它无 ...

  6. hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到

    题意: 一个完全图,某两点边权为这两点编号之按位与,求最小生成树,输出字典序最小的. 题解: 如果点数不为$2^n-1$,则每一点均可找到一点,两点之间边权为0,只需找到该点二进制下其最左边的0是第几 ...

  7. 更改网卡名称以及重启网卡提示Determining if ip address x.x.x.x is already in use for device eth0

    安装系统完成后,在CentOS6.6下网卡名称变为em1,有些不太方便,还是改回eth0 修改grub配置文件,vi /boot/grub/grub.conf,增加如下红色字体 kernel /vml ...

  8. 新建mapping

    新建索引: PUT logstash-redis-log-2017.12 PUT logstash-redis-log-2017.12/_mapping/redis-log  {       &quo ...

  9. 03_springboot2.x日志处理

    1.日志框架 ​ 市场上存在非常多的日志框架.JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback.SLF4j ...

  10. netty 私有协议栈

    通信协议从广义上区分,可以分为公有协议和私有协议.由于私有协议的灵活性,它往往会在某个公司或者组织内部使用,按需定制,也因为如此,升级起来会非常方便,灵活性好.绝大多数的私有协议传输层都基于TCP/I ...