题解 | #字符串排序 归并 不使用库函数#

字符串排序

https://www.nowcoder.com/practice/5af18ba2eb45443aa91a11e848aa6723

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
std::vector<string> res;
bool compare(const std::string& str1, const std::string& str2){
    int len = min(str1.size(), str2.size());
    // 小到大排序
    for (int i = 0; i < len; ++i){
        if (str1[i] < str2[i]) return true;
        else if (str1[i] > str2[i]) return false;
    }
    if (str1.size() == len) return true;
    return false;
}

bool compare_1(const std::string& str1, const std::string& str2){
    int len = min(str1.size(), str2.size());
    // 大到小排序
    for (int i = 0; i < len; ++i){
        if (str1[i] > str2[i]) return true;
        else if (str1[i] < str2[i]) return false;
    }
    if (str1.size() == len) return false;
    return true;
}

void merge_algorithm(std::vector<string>& vec, int start, int mid, int end){
    // 将两段数组排序
    res.clear();
    int leftStart = start;
    int rightStart = mid + 1;
    int count = 0;
    while (leftStart <= mid && rightStart <= end){
        // 左右两端没有全部排序完 从小到大排序
        if (compare(vec[leftStart], vec[rightStart])){
            // std::cout << "vec[leftStart]: " << vec[leftStart] << std::endl;
            res.push_back(vec[leftStart]);
            leftStart++;
        }else{
            res.push_back(vec[rightStart]);
            rightStart++;
        }
    }
    // 左段数组先排完序
    while (rightStart <= end){
        res.push_back(vec[rightStart++]);
    }
    // 右段数组先排完
    while (leftStart <= mid){
        res.push_back(vec[leftStart++]);
    }
    // 处理原数组
    for (int i = 0; i < res.size(); ++i){
        // std::cout << "res" << res[i] << std::endl;
        vec[i + start] = res[i]; 
        // std::cout << "vec" << vec[i] << std::endl;

    }

}

void merge_sort(std::vector<string>& str, int start, int end){
    // 划分数组
    if (start >= end) return;
    int mid = start + (end - start)/2;
    merge_sort(str, start, mid);
    merge_sort(str, mid+1, end);
    merge_algorithm(str, start, mid, end);

}

int main() {
    int n;
    std::cin >> n;
    std::vector<string> result;
    for (int i = 0; i < n; ++i){
        string tmp;
        std::cin >> tmp;
        result.push_back(tmp);
    }
    // sort(result.begin(), result.end(), compare);
    merge_sort(result, 0, result.size() - 1);
    for (auto tmp : result){
        std::cout << tmp << std::endl;
    }
    return 0;

}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

06-26 15:35
武汉大学 运营
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务