Day12 2023/01/19
难度:简单
题目
给定n个字符串,请对n个字符串按照字典的顺序排列。
数据范围:1 <= n <=1000 ,字符串长度满足:1 <= len <= 100
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述:
数据输出n行,输出结果为按照字典序排列的字符串。
示例
输入:9
cap
to
cat
card
two
too
up
boat
boot
输出:boat
boot
cap
card
cat
to
too
two
up
思路一
把 n 个字符串存储在一个大小为 n 的数组中,题目的按字典顺序排列,即将数组元素按升序排列(由小到大),实现升序排列可以使用经典的冒泡排序算法
思路二
在思路一的基础上可以利用c++库函数sort()来实现升序排列。
关键点
- 冒泡排序的基本过程如图所示:
比较相邻元素,前一个比后一个大(或者前一个比后一个小)就交换位置。对每一对相邻元素都进行这样的重复操作。
-
冒泡排序中外层循环控制总的循环次数,内层循环控制每次相邻元素的比较次数。
-
sort(begin, end, cmp);begin是起始下标,end为终止下标,cmp为比较函数(自定义的)。不写cmp,默认是按升序排列。 -
c++中支持string类型直接比较。(本质是比较ascii码的大小)。
算法实现
c++代码实现1-冒泡排序
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//方法一:冒泡排序
int main() {
int n; //字符串个数
cin >> n;
vector<string> strs; //字符串数组
string s; //单个字符串
string tmp; //交换的中间变量
for (int i = 0; i < n; i++) { //输入n个字符串
cin >> s;
strs.push_back(s);
}
cout << endl << "输出:" << endl;
// 使用冒泡排序的方式实现升序序列
for (int i = 0; i < n - 1; i++) {
for (int j = 1; j < n - i; j++) {
if (strs[j - 1] > strs[j]) { //比较并冒泡,c++中支持string类型直接比较大小
tmp = strs[j]; //交换
strs[j] = strs[j - 1];
strs[j - 1] = tmp;
}
}
}
for (int k = 0; k < n; k++) cout << strs[k] << endl; //输出排序后的字符串
return 0;
}
- 时间复杂度 --- 两层嵌套循环,n为字符个数
- 空间复杂度 --- 无额外的辅助空间
c++代码实现2-sort函数
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
//方法二:sort函数
int main () {
int n; //字符串个数
cin >> n;
vector<string> strs; //字符串数组
string s; //单个字符串
for (int i = 0; i < n; i++) { //输入n个字符串
cin >> s;
strs.push_back(s);
}
cout << endl << "输出:" << endl;
sort(strs.begin(), strs.end()); //使用sort函数实现升序排列
for (int k = 0; k < n; k++) cout << strs[k] << endl; //输出排序后的字符串
return 0;
}
- 时间复杂度 --- sort函数的复杂度为O(nlogn)
- 空间复杂度 --- 无额外的辅助空间
总结
- sort()内部实现是一种优化过的快速排序,时间复杂度较低,十分推荐在排序类的题目中使用。