/*********************************************
sort函数的用法(恰好与qsort相反)//每有新发现都会持续更新
做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.对int 型数组排序(其他的雷同,可以自己编写)
*********************************************/
int a[100];
int cmp(int a,int b)
{
return a - b; //a - b与a > b都是按降序排序;a < b是按升序排序;
}
sort(a,a+100,cmp);
/*********************************************
2.其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在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 a[20]={2,4,1,23,5,76,0,43,24,65};
sort(a,a+20,greater<int>());
sort(a,a+20,less<int>());
/*********************************************
3.既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:
*********************************************/
int main()
{
string a("abcba");
string b(a.rbegin(),a.rend());
if(a == b)
cout << "666" << endl; //回文串,就是这么简单
return 0;
sort函数的用法(恰好与qsort相反)//每有新发现都会持续更新
做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.对int 型数组排序(其他的雷同,可以自己编写)
*********************************************/
int a[100];
int cmp(int a,int b)
{
return a - b; //a - b与a > b都是按降序排序;a < b是按升序排序;
}
sort(a,a+100,cmp);
/*********************************************
2.其实对于这么简单的任务(类型支持“<”、“>”等比较运算符),完全没必要自己写一个类出来。标准库里已经有现成的了,就在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 a[20]={2,4,1,23,5,76,0,43,24,65};
sort(a,a+20,greater<int>());
sort(a,a+20,less<int>());
/*********************************************
3.既然有迭代器,如果是string 就可以使用反向迭代器来完成逆序排列,程序如下:
*********************************************/
int main()
{
string a("abcba");
string b(a.rbegin(),a.rend());
if(a == b)
cout << "666" << endl; //回文串,就是这么简单
return 0;
}
//参考:http://blog.csdn.net/u012209626/article/details/48792049