SORT函数的使用方法(转载)

sort函数的用法(转载出处:http://blog.sina.com.cn/s/blog_6439f26f01012xw3.html)

做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。
    这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。
    拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len);
    对向量v排序也差不多,sort(v.begin(),v.end());
    排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。
    如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp
bool cmp(int a,int b)
{
    return a>b;
}
   排序的时候就写sort(a,a+100,cmp);

   假设自己定义了一个结构体node
struct node{
    int a;
    int b;
    double c;
}
   有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:

以下是代码片段:
bool cmp(node x,node y)
{
     if(x.a!=y.a) return x.a

if(x.b!=y.b) return x.b>y.b;
     return return x.c>y.c;
}    
 排序时写sort(arr,a+100,cmp);

qsort(s[0],n,sizeof(s[0]),cmp);
int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}

 

一、对int类型数组排序  

int num[100];  

Sample:  

int cmp ( const void *a , const void *b )  
{  
return *(int *)a - *(int *)b;  
}  

qsort(num,100,sizeof(num[0]),cmp);  

二、对char类型数组排序(同int类型)  

char word[100];  

Sample:  

int cmp( const void *a , const void *b )  
{  
return *(char *)a - *(int *)b;  
}  

qsort(word,100,sizeof(word[0]),cmp);  

三、对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);  

四、对结构体一级排序  

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

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

时间: 2024-12-16 18:47:13

SORT函数的使用方法(转载)的相关文章

STL之sort函数的使用方法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! STL封装了一个排序算法,该算法对应的头文件为#include<algorithm>,我们可以根据需要对一个数组进行排序或者降序. sort的函数原型为: void sort(b,e,pre=up),表示对[b,e)的元素进行排序,第三个参数为一个谓词,我们可以自定义排序方式,默认排序方式为升序排序. 具体实现代码如下: #include<iostream> #include<vector> #include<i

sort函数自定义compare方法

今天看到有C++这样写: sort(ins.begin(), ins.end(), [](Interval a, Interval b){return a.start < b.start;}); 觉得好牛逼啊.一般是这么写的. bool xxx(const A& a, const A& b) {return a.xxx < b.xxx;} 不知道上面那个居然可以,很可能是C++11里面的写法吧.

qsort函数以及sort函数使用方法

?? sort函数的使用方法 做ACM题的时候,排序是一种常常要用到的操作. 假设每次都自己写个冒泡之类的O(n^2)排序,不但程序easy超时,并且浪费宝贵的比赛时间,还非常有可能写错. STL里面有个sort函数,能够直接对数组排序,复杂度为n*log2(n).使用这个函数.须要包括头文件. 这个函数能够传两个參数或三个參数. 第一个參数是要排序的区间首地址,第二个參数是区间尾地址的下一地址.也就是说.排序的区间是[a,b).简单来说,有一个数组int a[100].要对从a[0]到a[99

C++中 sort 函数的使用详解

STL主要包含容器,迭代器,算法三块内容,用户可以对容器进行一系列的操作,比如遍历和计算,而STL提供的迭代器和容器完美地提供了这样的接口.其中std::vector是最常用的容器之一,vector是一个模板类,定义在命名空间namespace下,使用vector需要在包含相关头文件.今天主要讲解对vector的排序的使用. 常见的排序算法有快速排序.冒泡排序.归并排序等.STL中sort函数的实现跟STL的版本有关,而往往sort函数是由多种排序算法混合而成的. 1. vector元素为内置数

C++ 排序函数 sort(),qsort()的使用方法

想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描写叙述 sort 对给定区间全部元素进行排序 stable_sort 对给定区间全部元素进行稳定排序 partial_sort 对给定区间全部元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置相应的元素 is_sorted 推断一个区间是否已经排好序 p

qsort函数、sort函数 (精心整理篇)(转载)

qsort函数.sort函数 (精心整理篇) 先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分. 具体介绍:-^^ void qsor

sort函数的正确使用方法

//sort()函数是用来实现数组排序的var arr = [0,5,6,4,3]; var arr1 = [25,13,46,12]; var arr2 = [100,523,123,448]; 如果按照以上的,数组都是同位数的,sort就会正常的执行 如果 var arr  = [5,100,36,12,6,5] 他的执行完之后就会变成 [100, 12, 36, 5, 5, 6] 很明显是错的 因为sort函数的原理是 根据数组的数字中的第一个字符比较来排序的,然后在从第二个字符比较排序,

实战c++中的vector系列--使用sort算法对vector&lt;unique_ptr&lt;string&gt;&gt;进行排序(sort函数出错“应输入 2 个参数,却提供了 3 个)

之前博客写了对vector使用sort算法进行的排序,之前也写到过vector<unique_ptr<string>>的一些处理方法. 今天就写一下对vector<unique_ptr<string>>使用sort算法进行排序. #include<iostream> #include<string> #include<vector> #include<algorithm> #include<memory&

C++中的sort函数

(一)为什么要用c++标准库里的排序函数 Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高! (二)c++标准库里的排序函数的使用方法 I)Sort函数包含在头文件为#include<algorithm>的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可! II)Sort函数有三个参