HJ14 字符串排序

79 阅读1分钟

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()来实现升序排列。

关键点


  • 冒泡排序的基本过程如图所示:

6F229432679FB83CE1610B10BB5ECF7E.gif
比较相邻元素,前一个比后一个大(或者前一个比后一个小)就交换位置。对每一对相邻元素都进行这样的重复操作。

  • 冒泡排序中外层循环控制总的循环次数,内层循环控制每次相邻元素的比较次数。

  • 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;
}
  • 时间复杂度 O(n2)O(n^2) --- 两层嵌套循环,n为字符个数
  • 空间复杂度 O(1)O(1) --- 无额外的辅助空间

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;
}
  • 时间复杂度 O(nlogn)O(nlogn) --- sort函数的复杂度为O(nlogn)
  • 空间复杂度 O(1)O(1) --- 无额外的辅助空间

总结

  • sort()内部实现是一种优化过的快速排序,时间复杂度较低,十分推荐在排序类的题目中使用。