STL中sort函数用法简介

STL中sort函数用法简介
STL中sort函数用法简介

STL中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

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

最后看一个完整的实例,初赛时的一道题目“文件名排序”。

以下是代码片段:

#include

#include

#include

using namespace std;

//定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")

struct node{

string a,b;

};

//ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z'

//而这题要求忽略大小写,博彩评级https://www.360docs.net/doc/1911484230.html, 所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思

//先把两个字符串全部转化为小写,再比较大小(字典序)

bool lt(string x,string y)

{

int i;

for(i=0;i

if(x[i]>='A'&&x[i]<='Z')

x[i]='a'+(x[i]-'A');

for(i=0;i

if(y[i]>='A'&&y[i]<='Z')

y[i]='a'+(y[i]-'A');

return x

}

//自定义的比较函数,先按b值升序排列(也就是"Dir"排在"File"前面)澳门新濠天地官网https://www.360docs.net/doc/1911484230.html,

//如果b值相同,再按a升序排列,用的是刚才定义的lt函数

bool comp(node x,node y)

{

if(x.b!=y.b)return x.b

return lt(x.a,y.a);

}

int main()

{

node arr[10001];

int size=0;

while(cin>>arr[size].a>>arr[size].b)

size++;

sort(arr,arr+size,comp);

for(int i=0;i

cout<

return 0;

}

sort和qsort函数对结构体的二级排序

qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值 的数组来说,基本快速排序的效率较低,且不稳定)。集成在C语言库函数里面的的qsort函数, 使用三路划分的方法解决排序这个问题。所谓三路划分,是指把数组划分成小于划分值,等于 划分值和大于划分值的三个部分。 具体介绍:-^^ void qsort( void *base, size_t num, size_t width, int (__cdecl *compare ) int compare (const void *elem1, const void *elem2 ) ); qsort(即,quicksort)主要根据你给的比较条件给一个快速排序,主要是通过指针移动实现排序 功能。排序之后的结果仍然放在原来数组中。 参数意义如下: 第一个参数 base 是需要排序的目标数组名(或者也可以理解成开始排序的地址,因为可以写 &s[i]这样的表达式) 第二个参数 num 是参与排序的目标数组元素个数 第三个参数 width 是单个元素的大小(或者目标数组中每一个元素长度),推荐使用sizeof(s[0]) 这样的表达式 第四个参数 compare 就是让很多人觉得非常困惑的比较函数啦。 我们来简单讨论compare这个比较函数(写成compare是我的个人喜好,你可以随便写成什么,比如 cmp 什么的,在后面我会一直用cmp做解释)。 典型的compare的定义是int compare(const void *a,const void *b); 返回值必须是int,两个参数的类型必须都是const void *,那个a,b是随便写的,个人喜好。假 设是对int排序的话,如果是升序,那么就是如果a比b大返回一个正值,小则负值,相等返回0,其他的依次类推,后面有例子来说明对不同的类型如何进行排序。

sort 函数用法简介

STL中sort函数用法简介 使用这个函数,需要包含头文件#include 。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。 对向量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); 最后看一个完整的实例,初赛时的一道题目“文件名排序”。 以下是代码片段: #include #include #include using namespace std; //定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir")struct node{ string a,b; }; //ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z' //而这题要求忽略大小写,所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思 //先把两个字符串全部转化为小写,再比较大小(字典序) bool lt(string x,string y) { int i; for(i=0;i='A'&&x[i]<='Z') x[i]='a'+(x[i]-'A'); for(i=0;i='A'&&y[i]<='Z') y[i]='a'+(y[i]-'A'); return x

java中Map类

java中Map类 Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象。 Map的接口 Map---实现Map Map.Entry--Map的内部类,描述Map中的按键/数值对。 SortedMap---扩展Map,使按键保持升序排列 关于怎么使用,一般是选择Map的子类,而不直接用Map类。 下面以HashMap为例。 public static void main(String args[]) { HashMap hashmap = new HashMap(); hashmap.put("Item0", "Value0"); hashmap.put("Item1", "Value1"); hashmap.put("Item2", "Value2"); hashmap.put("Item3", "Value3"); Set set = hashmap.entrySet(); Iterator iterator = set.iterator(); while (iterator.hasNext() { Map.Entry mapentry = (Map.Entry) iterator.next(); System.out.println(mapentry.getkey() + "/" + mapentry.getValue()); } } 注意,这里Map的按键必须是唯一的,比如说不能有两个按键都为null。 如果用过它,就会知道它的用处了。 又比如: Map map = new HashMap(); map.put("Order", (Order) obj); 资料: Collection容器中包含Set和List接口,Set中又包含HashSet,List中包含LinkedList和ArrayList;单独的Map接口中只有HashMap。 java.util 中的集合类包含Java 中某些最常用的类。最常用的集合类是List 和Map。List 的具体实现包括ArrayList 和Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形,其中的数据有顺序且可以重复。而Set中数据无顺序且不可以重复。

53.String sort 字符串排序的几种方法

String sort的几种方法 简介 在之前的一些排序算法中,主要是对一些数值的类型比较的比较多一点。而对于字符串类型来说,它有一些特殊的性质。如果按照传统的排序方法,对于字符串的比较性能其实还取决于字符串的长度以及相似程度。实际上,对于一些字符集的取值在一个比较小的范围内的情况,我们可以有一些比较高效率的算法。这里针对这些特殊的情况进行讨论。 假设给定的排序集合里元素,也就是每个字符都是在一个比较有限的范围里,比如说256个字符范围内。那么,我们可以利用这个特性做一些高效的处理。联想到之前讨论过的counting sort和radix sort方法。这里就是利用了这个特性。 Key-Indexed counting 在之前讨论couting sort的文章里,曾经针对需要排序的元素为数字的情况进行过讨论。counting sort成立的一个前提是它里面所有的元素取值是在一个固定的范围内。假设这个数组里元素能取的最大值是k,那么每次我们要排序的时候只需要声明一个长度为k的数组a。每次碰到一个元素i就将a[i]对应的值加1。这样就统计出来了所有从小到大的元素的值的分布。剩下的就只是从小到达把这些值重新排列输出就可以了。 当然,在一些数字有一定长度而且它们的长度都一样的情况下。我们可以利用从高到低或者从低到高位逐位排序的方式来对数组进行排序。这就是radix sort的基本思路。它本质上就是在每一位的排序上都使用了couting sort。 借鉴前面对于数字的排序,我们对于字符串数组的排序也可以采用类似的方式: Java代码 1.int[] count = new int[R + 1]; 2.//计算每个字符出现的频率 3.for(int i = 0; i < n; i++) 4. count[a[i].charAt(d) + 1]++; 5.//将每个字符出现的频率转换为所在的索引 6.for(int r = 0; r < R; r++) 7. count[r + 1] += count[r]; 8.//将字符分布到具体的数组位置 9.for(int i = 0; i < n; i++) 10. aux[count[a[i].charAt(d)]++] = a[i]; 11.//将结果拷贝回数组 12.for(int i = 0; i < n; i++) 13. a[i] = aux[i]; 上述代码里的R表示当前字符的取值范围。在R值不大的时候它的效率还是相当可观的。在这个计数排序的基础上,我们可以得到一些不同的排序算法。 LSD sort 一种最典型的方法就是从最低位向最高位的方式依次排序,这种和前面的radix sort的思路基本上完全一样。不过在前面的基础上针对字符的情况稍微做一点修改。详细的代码实现如下: Java代码 1.public class LSD {

c++sort

sort()函数是C++中的排序函数其头文件为:#include头文件;qsort()是C中的排序函数,其头文件为:#include 1、sort() sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort_copy 对给定区间复制并排序 nth_element 找出给定区间的某个位置对应的元素 is_sorted 判断一个区间是否已经排好序 partition 使得符合某个条件的元素放在前面 stable_partition 相对稳定的使得符合某个条件的元素放在前面 语法描述为: (1)sort(begin,end),表示一个范围,例如: #include "stdafx.h" #include #include using namespace std; int _tmain(int argc, _TCHAR* argv[]) { int a[10]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<10;i++) cout<

输出结果将是把数组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 ab” } int _tmain(int argc, _TCHAR* argv[]) { int a[10]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<10;i++) cout<

集合里Map,Set,List的区别

Java中的Set,List,Map的区别 (转) 对JAVA的集合的理解是相对于数组 相对于数组的是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型) JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map没有 Collection接口的方法: boolean add(Object o) :向集合中加入一个对象的引用 void clear() :删除集合中所有的对象,即不再持有这些对象的引用 boolean isEmpty() :判断集合是否为空 boolean contains(Object o): 判断集合中是否持有特定对象的引用 Iterartor iterator() : 返回一个Iterator对象,可以用来遍历集合中的元素 boolean remove(Object o):从集合中删除一个对象的引用 int size() :返回集合中元素的数目 Object[] toArray() :返回一个数组,该数组中包括集合中的所有元素 关于:Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。 Iterator接口声明了如下方法: hasNext(): 判断集合中元素是否遍历完毕,如果没有,就返回true next() :返回下一个元素 remove():从集合中删除上一个有next()方法返回的元素。 Set(集合): Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。 Set接口主要实现了两个实现类: HashSet : HashSet类按照哈希算法来存取集合中的对象,存取速度比较快

kind与sort 的区别和用法(a ~ of, this ~ of, many kinds of )

a kind of, this kind of, many kinds of 和 a sort of区别和用法 kind作名词用时,表示种类,比较下面的结构: a kind of +单数名词(不加冠词)一种 this kind of +单数名词(不加冠词)这种 many kinds of +单数名词丨复数名词(不加冠词) 许多种 different kinds of +单数名词丨复数名词(不加冠词) 不同种类 these kinds of +单数名词丨复数名词(不加冠词) 这些种类 all kinds of 单数名词丨复数名词(不加冠词) 各种 This is a new kind of pen.(正)这是一种新型钢笔。 This is a new kind of pens.(误) I like that kind of apple.(正)我喜欢那种苹果 I like that kind of an apple.(误) He saw many kinds of machine.(正)他见到了许多种机器。 He saw many kinds of machines.(正) He wants to buy different kinds of stamp.(正)他想买不同种类的邮票。He wants to buy different kinds of stamps.(正)

She lent me three kinds of book.(正)她借给我三种书。 She lent me three kinds of books.(正) He has read all kinds of story-book.(正)他读过各种各样的故事书。 He has read all kinds of story-books. 正) 【比较】 This kind of book is worth reading.这种书值得读。(一种〉 These kinds of books are worth reading.这些种类的书值得读。(多种) What kind of bookis it?它是什么种类的书? What kind of books are these?这些是什么种类的书?(注意,在what kind lof结构中,kind —般不加s) ■ many kinds of, different kinds of, these kinds of 和 all kinds of 修饰名词作主语时,谓语动词要用复数形式。、 Many kinds of shoes are on show in the shop.商店里展出了许多种类的鞋。 There are all kinds of trees along the lake.沿湖有各种各样的树。 a kind of+名词结构中,形容词通常修饰kind,修饰名词的情况偶尔也有, 但不自然。

STL中sort函数用法简介

STL中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 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); 最后看一个完整的实例,初赛时的一道题目“文件名排序”。 以下是代码片段: #include #include #include using namespace std; //定义一个结构体来表示文件,a代表文件名,b代表文件类型(要么"File"要么"Dir") struct node{ string a,b; }; //ASCII码中,所有大写字母排在所有小写字母前面,'A'<'Z'<'a'<'z' //而这题要求忽略大小写,博彩评级https://www.360docs.net/doc/1911484230.html, 所以不能直接用字符串的比较。自定义了一个lt函数,就是less than的意思 //先把两个字符串全部转化为小写,再比较大小(字典序)

java_Set,List,Map,Vector,ArrayList的区别

JAVA的容器---List,Map,Set Collection ├List │├LinkedList │├ArrayList │└Vector │└Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。 所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下: Iterator it = collection.iterator(); // 获得一个迭代子 while(it.hasNext()) { Object obj = it.next(); // 得到下一个元素 } 由Collection接口派生的两个接口是List和Set。

Linux操作系统中排序命令Sort的使用方法

语法格式 sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Dir ectory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] [ -k KeyDefinition ] [文件 ] 使用说明 sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。-(减号)代替文件名指定标准输入。如果您不指定任何文件名,那么该命令对标准输入排序。可以使用 -o 标志指定输出文件。 如果不指定任何标志,sort 命令基于当前语言环境的整理顺序对输入文件的所有行排序。主要参数 -A 使用 ASCII 整理顺序代替当前语言环境的整理顺序在逐字节的基础上排序。 -b 忽略前导空格和制表符,找出字段的第一或最后列。 -c 检查输入是否已按照标志中指定的排序规则进行排序。如果输入文件排序不正确,就返回一个非零值。 -d 使用字典顺序排序。比较中仅考虑字母、数字和空格。 -f 比较前将所有小写字母改成大写字母。 -i 比较中忽略所有非显示字符。 -k KeyDefinition 指定排序关键字。KeyDefinition 选项的格式为: [ FStart [ .CStart ] ] [ ModifIEr ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ]排序关键字包括所有以 FStart 变量指定的字段和 CStart 变量指定的列开头的字符及以 FEnd 变量指定的字段和 CEnd 变量指定的列结束的字符。Modifier 变量的值可以是 b、d、f、i、n 或 r。修饰符与同一字母的标志等价。-m 只合并多个输入文件;假设输入文件已经排序。 -n 按算术值对数字字段排序。数字字段可包含前导空格、可选减号、十进制数字、千分位分隔符和可选基数符。对包含任何非数字字符的字段进行数字排序会出现无法预知的结果。 -o OutFile 将输出指向 OutFile 参数指定的文件,而不是标准输出。OutFile 参数值可以与 File 参数值相同。 -r 颠倒指定排序的顺序。 -t Character 指定 Character 为单一的字段分隔符。 -u 禁止按照排序关键字和选项的所有等同排序(每一组行中一行除外)。 -T Directory 将创建的所有临时文件放入 Directory 参数指定的目录中。 -y[Kilobytes] 用 Kilobytes 参数指定的主存储的千字节数启动 sort 命令,并根据需要增加存储量。(如果 Kilobytes 参数指定的值小于最小存储站点或大于最大存储站点,就以这个最小存储站点或最大存储站点取代)。如果省略 -y 标志,sort 命令以缺省的存储大小启动。-y0 标志用最小存储启动,而 -y 标志(不带 Kilobytes 值)用最大存储启动。sort 命令使用的存储量显著地影响性能。以大存储量对小文件排序将很浪费。 -z RecordSize 如果正在排序的任一行大于缺省的缓冲区大小,要防止出现异常终止。指定 -c 或 -m 标志时,省略排序阶段,使用系统的缺省缓冲大小。如果已排序行超出这一大小,排序异常终止。-z 选项指定排序阶段最长行的记录,因而可在合并阶段分配足够的缓冲区。RecordSize 必须指明等于或大于要合并的最长行的字节值。

java中List的用法

java中List的用法和实例详解 List的用法 List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口,所以List接口拥有Collection接口提供的所有常用方法,又因为List是列表类型,所以List接口还提供了一些适合于自身的常用方法,如表1所示。 表1 List接口定义的常用方法及功能 从表1可以看出,List接口提供的适合于自身的常用方法均与索引有关,这是因为List集合为列表类型,以线性方式存储对象,可以通过对象的索引操作对象。 List接口的常用实现类有ArrayList和LinkedList,在使用List集合时,通常情况下声明为List类型,实例化时根据实际情况的需要,实例化为ArrayList或LinkedList,例如: List l = new ArrayList();// 利用ArrayList类实例化List集合 List l2 = new LinkedList();// 利用LinkedList类实例化List集合 1.add(int index, Object obj)方法和set(int index, Object obj)方法的区别 在使用List集合时需要注意区分add(int index, Object obj)方法和 set(int index, Object obj)方法,前者是向指定索引位置添加对象,而后者是修改指定索引位置的对象,例如执行下面的代码: src\com\mwq\TestCollection.java关键代码: public static void main(String[] args) { String a = "A", b = "B", c = "C", d = "D", e = "E"; List list = new LinkedList(); list.add(a);

最新sort函数的用法

sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort 函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。 做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;

excelvba中使用sort函数对工作表排序的方法

Excel VBA中使用Sort 函数对工作表排序的方法 工作表内单元格数据的排序,使用Range.Sort 命令。但是后面的参数较多,新人一般采用录制宏时出来一大堆,也不知道该如何编辑。因此,我开这一个帖子,给新人普及一下:Range("待排序数据区域").Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3)其中各类型参数的意义如下: ① key1、key2、key3 这些key是排序的关键列(或行)的单元格地址,如Range("A1") 实际只要选对列标题即可,对行数要求不敏感。【行数要求不敏感】

即数据区域中任意行数都可以:Range("A1")、或 Range("A2")、或Range("A1000")都可以。【注意】 1. 一次Sort只能调用至多3个参数,没有key4可以使用。 2. 至少使用1个参数即可,即key2、key3可以省去不用。【引用方法】 1. 带参数名引用,如:key1:=Range("G3") 带参数名引用时2. 参数位置引用,即按照上述Sort命令的参数顺序直接应用, 如:Range("A1:I19").Sort key1:=Range("G3") 即第1位置参数即为key1② Order1、Order2、Order3 这些Order是排序的顺序模式指定参数。即:A-Z升序、或Z-A降序 参数的模式名称为: A-Z升序= xlAscending 或直接=1

Java Map集合

java.util 中的集合类包含Java 中某些最常用的类。最常用的集合类是List 和Map。List 的具体实现包括ArrayList 和V ector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。List 适用于按数值索引访问元素的情形。 Map 提供了一个更通用的元素存储方法。Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。从概念上而言,您可以将List 看作是具有数值键的Map。而实际上,除了List 和Map 都在定义java.util 中外,两者并没有直接的联系。本文将着重介绍核心Java 发行套件中附带的Map,同时还将介绍如何采用或实现更适用于您应用程序特定数据的专用Map。 了解Map 接口和方法 Java 核心类中有很多预定义的Map 类。在介绍具体实现之前,我们先介绍一下Map 接口本身,以便了解所有实现的共同点。Map 接口定义了四种类型的方法,每个Map 都包含这些方法。下面,我们从两个普通的方法(表1)开始对这些方法加以介绍。 表1:覆盖的方法。我们将这Object 的这两个方法覆盖,以正确比较Map 对象的等价性。 Map 构建 Map 定义了几个用于插入和删除元素的变换方法(表2)。 表2:Map 更新方法:可以更改Map 内容。 尽管您可能注意到,纵然假设忽略构建一个需要传递给putAll() 的Map 的开销,使用putAll() 通常也并不比使用大量的put() 调用更有效率,但putAll() 的存在一点也不稀奇。这是因为,putAll() 除了迭代put() 所执行的将每个键值对添加到Map 的算法以外,还需要迭代所传递的Map 的元素。但应注意,putAll() 在添加所有元素之前可以正确调整Map 的大小,因此如果您未亲自调整Map 的大小(我们将对此进行简单介绍),则putAll() 可能比预期的更有效。 查看Map 迭代Map 中的元素不存在直接了当的方法。如果要查询某个Map 以了解其哪些元素满足特定查询,或如果要迭代其所有元素(无论原因如何),则您首先需要获取该Map 的“视图”。有三种可能的视图(参见表3) 所有键值对—参见entrySet() 所有键—参见keySet() 所有值—参见values() 前两个视图均返回Set 对象,第三个视图返回Collection 对象。就这两种情况而言,问题到这里并没有结束,这是因为您无法直接迭代Collection 对象或Set 对象。要进行迭代,

ACM_ICPC竞赛中sort函数的简要介绍

Electronic Technology & Software Engineering 电子技术与软件工程? 227Program Design ? 程序设计【关键词】sort 函数 程序设计 1 sort函数的介绍及优点 sort 函数是STL 中用于对给定区间 进行排序的函数,所在头文件是#include 。主要原理是快速排序,但又不是 简单的快速排序,它还结合了插入排序和堆排 序,根据需要排序对象的不同情况,自动选用 合适的排序方法。所以虽然理论上sort 函数和 快速排序的复杂度都是O(n*logn),但在实际 应用中,sort 函数比快速排序的效率更高,实 用方法简单,因此更加实用。 2 sort函数的使用方法 sort 函数有三个参数 (1)要排序数组的起始地址。 (2)要排序数组的结束地址,即最后一 个要排序地址的下一个地址。 (3)排序方法,可以是从大到小,也可 以自定义,也可以不写,如果不写,默认的排 序方式是从小到大排序。 sort 函数使用模板是: sort(start,end,cmp); 对区间[?rst,last)根据cmp 的方式进行排 序。 3 sort函数的用法举例 3.1 直接使用 整型默认为从小到大排序,字符型根据 ASCII 码值进行排序。 int a[N]; sort(a+?rst,a+last); N 为整型常数,?rst 为起始地址,last 为 结束地址。 3.2 自定义排序ACM_ICPC 竞赛中sort 函数的简要介绍 文/焦静颐 崔驭 贾子璇 3.2.1 自定义比较函数int a[N];bool cmp(int x,int y){return x>y;}sort(a+?rst,a+last,cmp);系统默认为x>y 返回true ,故程序是从大到小排序。3.2.2 重载比较运算符这种方法用于结构体中。struct point {int a,b;}e[N];bool operator<(const point& x,const point& y){if(x.a==y.a) return x.by.a;}sort(e+?rst,e+last);根据成员a 的数值由大到小排序,当a 的数值相同时,根据成员b 的数值由小到大排序。 4 结束语sort 函数在使用上带来极大便利,因为高效率,使用灵活的特点,无论是在日常开发中还是算法竞赛中,sort 函数都能发挥很大的作用。本文介绍了sort 的使用方法,只要加以练习,就可以将sort 函数更好的应用。掌握好sort 函数对学生学习其他STL 函数也有很大帮助,可以提高学生的编程能力。参考文献[1]Nicolai M.Josuttis.C++标准程序库[M]. 华中科技大学出版社,2002.[2]刘汝佳.算法竞赛入门经典(第二版)[M]. 清华大学出版社,2014.作者简介焦静颐(2000-),女,天津市人。 大学本科在读。主要研究方向为计算机类。作者单位河北农业大学信息科学与技术学院 河北省保定市 071001

php排序函数

一、简单排序 ?函数:sort()和rsort() $data =array(5,8,1,7,2); sort($data); print_r($data); rsort($data); print_r($data); 二、关键字排序 ?函数Ksort()和Krsort() $data = array( "CH" => "China", "IN" => "India", "DE" => "Germany", "ES" = "Spain“ ); ksort($data); print_r($data); krsort($data); print_r($data); 三、按值排序 ?函数asort()和arsort() $data = array("CH" => "China", "IN" => "India", "DE" => "Germany", "ES" => "Spain " ); asort($data); print_r($data); arsort($data); print_r($data); 四、自然语言排序 ?函数:natsort()和array_reverse() $data = array("A", "B", " C"); //sort($data); //print_r($data); natsort($data); print_r($data); natsort($data); print_r(array_reverse($data)); 五、自定义排序 ?函数:usort() $data = array("ajax", "linux", "javascript", "php"); usort($data, 'sortByLen'); print_r($data); function sortByLen($a, $b) { if (strlen($a) == strlen($b)) { return 0; } else { return (strlen($a) > strlen($b)) ? 1 : -1;

java中HashMap详解

java中HashMap详解 HashMap 和HashSet 是Java Collection Framework 的两个重要成员,其中HashMap 是Map 接口的常用实现类,HashSet 是Set 接口的常用实现类。虽然HashMap 和HashSet 实现的接口规范不同,但它们底层的Hash 存储机制完全一样,甚至HashSet 本身就采用HashMap 来实现的。 通过HashMap、HashSet 的源代码分析其Hash 存储机制 实际上,HashSet 和HashMap 之间有很多相似之处,对于HashSet 而言,系统采用Hash 算法决定集合元素的存储位置,这样可以保证能快速存、取集合元素;对于HashMap 而言,系统key-value 当成一个整体进行处理,系统总是根据Hash 算法来计算key-value 的存储位置,这样可以保证能快速存、取Map 的key-value 对。 在介绍集合存储之前需要指出一点:虽然集合号称存储的是Java 对象,但实际上并不会真正将Java 对象放入Set 集合中,只是在Set 集合中保留这些对象的引用而言。也就是说:Java 集合实际上是多个引用变量所组成的集合,这些引用变量指向实际的Java 对象。 集合和引用 就像引用类型的数组一样,当我们把Java 对象放入数组之时,并不是真正的把Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量。

HashMap 的存储实现 当程序试图将多个key-value 放入HashMap 中时,以如下代码片段为例: Java代码 1. HashMap map = new HashMap(); 2. map.put("语文" , 80.0); 3. map.put("数学" , 89.0); 4. map.put("英语" , 78.2); HashMap 采用一种所谓的“Hash 算法”来决定每个元素的存储位置。 当程序执行map.put("语文" , 80.0); 时,系统将调用"语文"的hashCode() 方法得到其hashCode 值——每个Java 对象都有hashCode() 方法,都可通过该方法获得它的hashCode 值。得到这个对象的hashCode 值之后,系统会根据该hashCode 值来决定该元素的存储位置。 我们可以看HashMap 类的put(K key , V value) 方法的源代码: Java代码 public V put(K key, V value) { // 如果key 为null,调用putForNullKey 方法进行处理

相关文档
最新文档