1.sort函数
用于C++中,对给定区间所有元素进行排序。
头文件是#include <algorithm>
2.sort函数使用模板
(1)Sort(start,end,排序方法)
(2)Sort函数有三个参数:
第一个是要排序的数组的起始地址。
第二个是结束的地址(最后一位要排序的地址的下一地址)
第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
(3)排序方法举例:
按照从大到小的顺序:
bool compare(int a,int b)
{
return a>b;
}
复杂一点(加上判断条件):
bool cmp(number a,number b){
if(a.x==b.x){
return a.y<b.y;
}else{
return a.x<b.x;
}
}
3.sort与stable_sort的区别
百科上的定义为:
sort 对给定区间所有元素进行排序
stable_sort 对给定区间所有元素进行稳定排序
其中的区别是,带有stable的函数可保证相等元素的原本相对次序在排序后保持不变。
具体可参考下面的示例1与示例2,示例2中要求保持输入的相对位置不变,用到了stabe_sort
4.题目(来源:牛客网)
示例1:
代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
int main() {
char str[20];
while (scanf("%s", str) != EOF) {
sort(str, str + strlen(str));
printf("%s", str);
}
return 0;
}
测试结果:
题目分析:
(1)因为题目中要求从小到大排序,所以不需要加第三个参数
(2)当有大写字母和小写字母时,排序后大写字母是在前面的,所以sort函数是直接按照ASCII码的大小来排序的,所以此题不用单独考虑大小写的问题
示例2:
题目分析:
(1)根据规则1,可知用sort函数来进行排序;
(2)根据规则2,要求同时存在大小写,按照输入顺序,所以用stable_sort即可;
因为大写字母的ASCII码的大小要比小写字母小,所以在比较时,要先将大写字母换为小写字母,然后用stable_sort,可保证顺序不变
(3)根据规则3,非英文字母保持位置,所以要考虑如何确定该位置
代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(char a,char b) {
char x,y;
if(a>='A' && a<='Z') {
x=a+32;
} else {
x=a;
}
if(b>='A' && b<='Z') {
y=b+32;
} else {
y=b;
}
if(x>=y) {
return false;
} else {
return true;
}
}
vector<char> v;
int main() {
char str[1001];
while(gets(str)) {
for(int i=0;i<strlen(str);i++) {
if((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z')) {
v.push_back(str[i]);
}
}
stable_sort(v.begin(),v.end(),cmp);
for(int i=0,j=0;i<strlen(str);i++) {
if((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z')) {
printf("%c",v[j++]);
} else if(str[i]==' ') {
printf(" ");
} else {
printf("%c",str[i]);
}
}
printf("\n");
v.clear();
}
return 0;
}
测试结果:
代码分析:
(1)写了一个排序方法 cmp(),先将大写字母转换为小写字母,直接+32即可;
(2)使用Vector,将字母加入到容器中,并对其按排序规则排序;
for(int i=0;i<strlen(str);i++) {
if((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z')) {
v.push_back(str[i]);
}
}
(3)因为非英文字母的顺序不变,所以遍历原输入字符串,若原字符串是英文字母,则将容器v中的字符打印出一个,若原字符串是空格,则相应打印出空格,否则,按照原字符串中的内容打印。
for(int i=0,j=0;i<strlen(str);i++) {
if((str[i]>='A' && str[i]<='Z') || (str[i]>='a' && str[i]<='z')) {
printf("%c",v[j++]);
} else if(str[i]==' ') {
printf(" ");
} else {
printf("%c",str[i]);
}
}
示例3:
代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(string str1, string str2)
{
return str1.length() < str2.length();
}
int main()
{
string str;
vector<string> v;
int n;
while(cin >> n)
{
getchar();
v.clear();
while(n--)
{
getline(cin, str);
if(str == "stop")
{
break;
}
v.push_back(str);
}
sort(v.begin(), v.end(), cmp);
for(int i = 0; i < v.size(); ++i)
{
cout << v[i] << endl;
}
}
return 0;
}
测试结果: