做项目的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。

sort是STL中提供的算法,头文件为#include<algorithm>以及using namespace std; 函数原型如下:

1
2
3
4
5
template
<class
RandomAccessIterator>
void
sort ( RandomAccessIterator first, RandomAccessIterator last );
template
<class
RandomAccessIterator,
class
Compare>
void
sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

使用第一个版本是对[first,last)进行升序排序,默认操作符为"<",第二个版本使用comp函数进行排序控制,comp包含两个在[first,last)中对应的值,如果使用"<"则为升序排序,如果使用">"则为降序排序,分别对int、float、char以及结构体排序例子如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
#include<algorithm>
#include<string>
using
namespace std;
struct
product{
char
name[16];
float
price;
};
int
array_int[5]={4,1,2,5,3};
char
array_char[5]={'a','c','b','e','d'};
double
array_double[5]={1.2,2.3,5.2,4.6,3.5};
//结构比较函数(按照结构中的浮点数值进行排序)
bool
compare_struct_float(const
product &a,const
product &b){
return
a.price<b.price;
}
//结构比较函数(按照结构中的字符串进行排序)
bool
compare_struct_str(const
product &a,const
product &b){
return
string(a.name)<string(b.name);
}
//打印函数
void
print_int(const
int* a,int
length){
printf("升序排序后的int数组:\n");
for(int
i=0; i<length-1; i++)
printf("%d ",a[i]);
printf("%d\n",a[length-1]);
}
void
print_char(const
char* a,int
length){
printf("升序排序后的char数组:\n");
for(int
i=0; i<length-1; i++)
printf("%c ",a[i]);
printf("%c\n",a[length-1]);
}
void
print_double(const
double* a,int
length){
printf("升序排序后的dobule数组:\n");
for(int
i=0; i<length-1; i++)
printf("%.2f ",a[i]);
printf("%.2f\n",a[length-1]);
}
void
print_struct_array(struct
product *array, int
length)
{
for(int
i=0; i<length; i++)
printf("[ name: %s \t price: $%.2f ]\n", array[i].name, array[i].price);
puts("--");
}
void
main()
{
struct
product structs[] = {{"mp3 player", 299.0f}, {"plasma tv", 2200.0f},
{"notebook", 1300.0f}, {"smartphone",
499.99f},
{"dvd player", 150.0f}, {"matches",
0.2f }};
//整数排序
sort(array_int,array_int+5);
print_int(array_int,5);
//字符排序
sort(array_char,array_char+5);
print_char(array_char,5);
//浮点排序
sort(array_double,array_double+5);
print_double(array_double,5);
//结构中浮点排序
int
len = sizeof(structs)/sizeof(struct
product);
sort(structs,structs+len,compare_struct_float);
printf("按结构中float升序排序后的struct数组:\n");
print_struct_array(structs, len);
//结构中字符串排序
sort(structs,structs+len,compare_struct_str);
printf("按结构中字符串升序排序后的struct数组:\n");
print_struct_array(structs, len);
}

sort函数的用法

做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

1
2
3
4
bool
cmp(
int a,int
b)
{
return
a>b;
}

排序的时候就写sort(a,a+100,cmp);

假设自己定义了一个结构体node

1
2
3
4
5
struct
node{
int
a;
int
b;
double
c;
}

有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列。就可以写这样一个比较函数:

以下是代码片段:

1
2
3
4
5
6
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);

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

一、对int类型数组排序

1
2
3
4
5
6
7
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类型)

1
2
3
4
5
6
7
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类型数组排序(特别要注意)

1
2
3
4
5
6
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);

四、对结构体一级排序

1
2
3
4
5
6
7
8
9
10
11
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);

五、对结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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);

六、对字符串进行排序

1
2
3
4
5
6
7
8
9
10
11
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

1
2
3
4
5
6
7
8
9
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函数的更多相关文章

  1. STL sort 函数实现详解

    作者:fengcc 原创作品 转载请注明出处 前几天阿里电话一面,被问到STL中sort函数的实现.以前没有仔细探究过,听人说是快速排序,于是回答说用快速排序实现的,但听电话另一端面试官的声音,感觉不 ...

  2. 神奇的sort()函数

    今天来谈一谈sort()函数,sort() 方法用于对数组的元素进行排序,用法为arrayObject.sort(sortby):括号中的为可选参数,准确来说应该是一个函数,这个函数用来规定排序方法, ...

  3. qsort函数、sort函数【转】

    http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...

  4. C中的qsort函数和C++中的sort函数的理解与使用

    一.qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); ...

  5. python 中的sort 和java中的Collections.sort()函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

  6. sort函数用法

    原文链接:http://blog.csdn.net/csust_acm/article/details/7326418 sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作.如果每次都自己 ...

  7. Perl Sort函数用法总结和使用实例

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

  8. C++ sort函数

    (一)为什么要用c++标准库里的排序函数 Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于 ...

  9. 使用STL库sort函数对vector进行排序

    使用STL库sort函数对vector进行排序,vector的内容为对象的指针,而不是对象. 代码如下 #include <stdio.h> #include <vector> ...

  10. C++ algorithm 里的sort函数应用

    MSDN中的定义: template<class RanIt>    void sort(RanIt first, RanIt last); //--> 1)template< ...

随机推荐

  1. 如何用css将一个div设置为一个圆

    直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...

  2. Laravel SMS 短信发送包

    Laravel Sms Laravel 贴合实际需求同时满足多种通道的短信发送组件 我们基于业务需求在 overtrue/easy-sms 基础进行扩展开发,主要实现如下目标: 支持短信验证码直接在 ...

  3. 【Leetcode】【Easy】Pascal's Triangle II

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  4. 手写vector

    看过JDK源码,现在自己想实现一个vector. 最开始的时候,我大概构想了一下怎么设计,一种是设置一个指针数组来存放对象,这样修改的时候可以不用大量的元素复制,但后来仔细想了想,它需要设置一个额外的 ...

  5. PHP腾讯与百度坐标转换

    function coordinate_switch($a,$b){//百度转腾讯坐标转换 $a = Latitude , $b = Longitude $x = (double)$b - 0.006 ...

  6. 【分享】Adobe Flash Player各版本安装包官方直接下载地址

    用常规方法下载比较繁琐,先会下个下载器,再下载安装包安装, 这里直接列出了安装包的下载地址,点击进入各版本的下载总页面, 拉到最下方就有各版本的下载地址,这里我直接列出来了: Chrome用的PPAP ...

  7. mysql:删除表数据drop、truncate和delete的用法

    程度从强到弱 1.drop  table tb        drop将表格直接删除,没有办法找回 2.truncate (table) tb       删除表中的所有数据,不能与where一起使用 ...

  8. 108. Convert Sorted Array to Binary Search Tree (building tree with resursion)

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. Fo ...

  9. 【转载】#445 - Differences Between an Interface and an Abstract Class

    An interface provides a list of members, without an implementation, that a class can choose to imple ...

  10. Release模式下无法调试打印对象的解决方式

    之前碰到在release模式下无法打印对象的问题,只能切换到debug模式下调试, xcode release 模式下, 会关掉断点读取变量的上下文环境,以提高运行速度, ⚠️ 记得调试完再改回去,防 ...