C/C++中字符串排序时的比较规则-精简总结

        问题的由来:最近在做一些算法题时,涉及到对字符串进行排序,网上查阅了大量文章感觉都没有对此问题有一个明确的说法,索性自己做实验并总结出一定的规律,方便自己也方便他人。

        问题的抽象:考虑对n个字符串(字符串均由可打印字符组成,具体而言十进制码值位于[32,126]这个区间)进行升序排序,输出排序后的字符串情况,并分析时间复杂度。

        问题的思考过程:以下面的ASCII码表为依据,从字符串的长度以及字符串的组成类型两个角度来思考排序时的比较规则。

  •  字符串中的字符都为同一类型(如均为数字字符串或小写字母串),但长度不同时:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    vector<string> vc = {"a", "b", "abc", "ad", "aba", "bdc"};
    vector<string> vc1 = {"0", "5", "110", "12", "101", "567"};

    sort(vc.begin(), vc.end());
    sort(vc1.begin(), vc1.end());

    for(auto &x : vc) {
        cout << x << " ";
    }
    cout << endl;
    for(auto &x : vc1) {
        cout << x << " ";
    }

    return 0;
}

【程序结果及分析】

         由结果可知,当字符串的字符组成为同一类型,排序时所采用的比较准则“从左至右依次比较每个字符,当字符不同时将码值较小者置于前面,当字符相同时则继续向后比较,直至每个字符都进行了比对(有提前结束者,则认为更小)”

  •  字符串中的字符都为同一类型(如均为数字字符串或小写字母串),且长度相同时:

        这种情况是第一种情况的特例,不存在比较时某个字符串提前结束的情况,从左至右挨个比较即可。

  •  字符串中的字符为不同类型(可打印字符的组合),但长度相同时:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    vector<string> vc = {"aac", "4ba", "A0B", "adf", "?56", "11a"};

    sort(vc.begin(), vc.end());

    for(auto &x : vc) {
        cout << x << " ";
    }

    return 0;
}

【程序结果及分析】

         先大致对ASCII码表的符号分布有一个大致印象:一些标点符号以及四则运算符分布在数字0~9的前后,A~Z紧跟着的不是数字而是@和?号,小写字母与大写字母之间也间隔着一些其他标点符号。

        此时,对于字符串的字符类型不同,但长度相同的情况,依然是从左至右的挨个比较字符,并将码值较小者置于前面

  •  字符串中的字符都为不同类型(可打印字符的组合),且长度不同时:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main()
{
    vector<string> vc = {"a", "4b", "A0B", "adffg", "?56", "1!a", "10a"};

    sort(vc.begin(), vc.end());

    for(auto &x : vc) {
        cout << x << " ";
    }

    return 0;
}

【程序结果及分析】

        此时,对于字符串的字符类型不同,且长度不同的情况,规则于第一种情况相同:从左至右依次比较每个字符,当字符不同时将码值较小者置于前面,当字符相同时则继续向后比较,直至每个字符都进行了比对(有提前结束者,则认为更小)。

【结论】

        上述的分析从字符串组成类型以及字符串长度两个角度出发,探讨了四种情况下的排序规则。总的来说,不考虑类型和长度的情况下,规则基本上都是从左至右依次比较每个字符,当字符不同时将码值较小者置于前面,当字符相同时则继续向后比较,直至每个字符都进行了比对(有提前结束者,则认为更小)。

        另外,对字符串进行快速排序(与对int型数据排序不同),不能单纯的认为时间复杂度就为O(nlogn),还需要考虑字符串的平均长度(假定为m),即在排序的过程中还要完成对字符串中m个字符的比对,故整体的时间复杂度应为O(m*nlogn)。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值