字符串中的字符排序

C++字符串排序

说明

使用哈希表辅助实现字符串中的字符的排序,是在Qt下写的程序,还有比较大的提升空间。

程序

    enum orderManner{
        ABtoab,           //顺序ABCD......abcd......
        abtoAB,           //顺序abcd......ABCD......
        AatoBb,           //顺序AaBbCcDd......
        aAtobB,           //顺序aAbBcCdD......
        ZYtozy,           //顺序ZYXW......zyxw......
        zytoZY,           //顺序zyxw......ZYXW......
        ZztoYy,           //顺序ZzYyXxWw......
        zZtoyY            //顺序zZyYxXwW......
    };
    QString str;
unordered_map<char, int> Testlib::createHashmap(Testlib::orderManner manner)//创建哈希表,给字母进行编号
{
    unordered_map<char,int> hashmap;
    switch(manner)
    {
       case ABtoab:
        for(int i=0;i<26;i++)
        {

            hashmap.insert(pair<char,int>('A'+i,i));
            hashmap.insert(pair<char,int>('a'+i,i+26));
        }break;
    case abtoAB:
        for(int i=0;i<26;i++)
        {

            hashmap.insert(pair<char,int>('A'+i,i+26));
            hashmap.insert(pair<char,int>('a'+i,i));
        }break;
    case AatoBb:
        for(int i=0;i<26;i++)
        {

            hashmap.insert(pair<char,int>('A'+i,i*2));
            hashmap.insert(pair<char,int>('a'+i,i*2+1));
        }break;
    case aAtobB:
        for(int i=0;i<26;i++)
        {

            hashmap.insert(pair<char,int>('A'+i,i*2+1));
            hashmap.insert(pair<char,int>('a'+i,i*2));
        }break;
    case ZYtozy:
        for(int i=0;i<26;i++)
        {
            hashmap.insert(pair<char,int>('A'+i,25-i));
            hashmap.insert(pair<char,int>('a'+i,51-i));
        }break;
    case zytoZY:
        for(int i=0;i<26;i++)
        {
            hashmap.insert(pair<char,int>('A'+i,51-i));
            hashmap.insert(pair<char,int>('a'+i,25-i));
        }break;
    case ZztoYy:
        for(int i=0;i<26;i++)
        {
            hashmap.insert(pair<char,int>('A'+i,50-i*2));
            hashmap.insert(pair<char,int>('a'+i,51-i*2));
        }break;
     case zZtoyY:
        for(int i=0;i<26;i++)
        {
            hashmap.insert(pair<char,int>('A'+i,51-i*2));
            hashmap.insert(pair<char,int>('a'+i,50-i*2));
        }break;
    return hashmap;
}

string Testlib::compareString(string str2,unordered_map<char,int> hashmap) //根据哈希表的编号进行排序
{
    for(uint i=0;i<str2.length()-1;i++)    //选择排序
    {
        int ii=0;                          //记录当前字符的编号
        ii=hashmap.find(str2[i])->second; //查询字符编号
        for(uint j=i+1;j<str2.length();j++)
        {
            int jj=0;
            jj=hashmap.find(str2[j])->second; //查询字符编号
            if(ii>jj)
            {
                std::swap(str2[i],str2[j]); //交换字符
                ii=jj;                   //字符交换之后,存储的编号也进行一次更新
            }
        }
    }
    return str2;
}
QString Testlib::orderingA_a(QString str,orderManner manner)
{
    if(str.isNull()) return nullptr; //空的就不需要处理了,不作该处理后面后面可能会直接GG
    string str2=str.toStdString();   //格式利用Qt自带的格式转换
    return orderingA_a(str2,manner);
}

QString Testlib::orderingA_a(string str,orderManner manner)
{
    if(str.empty()) return nullptr;//空的就不需要处理了,不作该处理后面后面可能会直接GG
    string str2=str;               //个人觉得还是赋个初值还是比较好的
    unordered_map<char,int> hashmap; //哈希表,key是字符,value是其编号
    hashmap=createHashmap(manner);  //根据manner创建相应的哈希表
    str2=compareString(str,hashmap); //根据哈希表的编号进行排序
    return QString::fromStdString(str2);
}

最后

在很大程度上制约排序速度的是compareString程序中使用的排序算法,换成快速排序法应该可以较大程度的提升排序的速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值