说明
使用哈希表辅助实现字符串中的字符的排序,是在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程序中使用的排序算法,换成快速排序法应该可以较大程度的提升排序的速度。