题目的主要信息:
- 对字符串进行排序
- 字符串仅包含字母字符和数字字符
方法一:sort函数快排
具体做法:
sort函数会直接比较字符的ASCⅡ码顺序,然后用快速排序法进行排序。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main(){
string s;
while(cin >> s){
sort(s.begin(), s.end()); //sort函数直接排序
cout << s << endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,sort函数的复杂度为
- 空间复杂度:,无额外空间
方法二:桶排序思想
具体做法:
我们直到字母数字中ASCⅡ码最大的是字母z,为122,那我们准备一个123大小的表,统计每个字符出现的次数,用表的表示ASCⅡ码,即可以表示该字符。遍历字符串,即将字符相应位置在表中的数量加1.
然后我们遍历这个表,对出现次数不为0的我们依次输出,也有可能出现不止一次,因此我们要循环输出,直到这个字符为0,再进入下一个,因为这个表直接有序,所以输出的元素就是有序的。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
string s;
while(cin >> s){
vector<int> table(123, 0); //统计123个ASCⅡ码出现次数
for(int i = 0; i < s.length(); i++){ //遍历字符串
table[s[i]]++; //相应ASCⅡ出现次数加1
}
for(int i = 0; i < table.size(); i++){ //遍历桶
while(table[i] > 0){ //依次输出所有桶中大于1的所有字符
cout << char(i);
table[i]--; //如果有多个要输出多次
}
}
cout << endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,遍历一次字符串,后续遍历桶也是相当于遍历字符串的长度
- 空间复杂度:,桶大小为123,属于常数空间