可以借鉴冒泡排序思想,因为冒泡排序是稳定排序,相等元素之间的相对位置不会改变。将所有字母视为一类相等元素,所有数字视为一类相等元素,所有符号视为一类相等元素,并且这三类元素的大小关系是:字母 < 数字 < 字符。
优化后的冒泡排序
优化后的冒泡排序,引入 lastExchange 来标识最后交换的位置,可以显著提高排序效率。当带排数组有序时,其时间复杂度为O(n)。
利用冒泡排序思想处理字符串
//
// 判断是否是字母
//////////////////////////////////////////////////////////////////////////
inline bool IsAlpha(const char c)
{
if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') return true;
else return false;
}
//
// 判断是否是其它符号
//////////////////////////////////////////////////////////////////////////
inline bool IsSymbol(const char c)
{
if (!IsAlpha(c) && !IsNum(c)) return true;
else return false;
}
//
// 两个字符相比较
//////////////////////////////////////////////////////////////////////////
int CharCmp(const char lhs, const char rhs)
{
if (IsAlpha(lhs) && IsAlpha(rhs)) return 0;
if (IsNum(lhs) && IsNum(rhs)) return 0;
if (IsSymbol(lhs) && IsSymbol(rhs)) return 0;
if (IsAlpha(lhs) && IsNum(rhs)) return -1;
if (IsAlpha(lhs) && IsSymbol(rhs)) return -1;
if (IsNum(lhs) && IsSymbol(rhs)) return -1;
if (IsNum(lhs) && IsAlpha(rhs)) return 1;
if (IsSymbol(lhs) && IsAlpha(rhs)) return 1;
if (IsSymbol(lhs) && IsNum(rhs)) return 1;
return 0;
}
//
// 解析字符串函数
//////////////////////////////////////////////////////////////////////////
void ParseString(char *str)
{
size_t len = strlen(str);
size_t lastExchange;
size_t i = len - 1;
while (i > 0)
{
lastExchange = 0;
for (size_t j = 0; j < i; j++)
{
if (CharCmp(str[j], str[j + 1]) > 0)
{
char tchar;
tchar = str[j + 1]; str[j + 1] = str[j]; str[j] = tchar;
lastExchange = j + 1;
}
}
i = lastExchange;
}
}
int main(void)
{
char s[50] = "asB,/?fw843azx,`23";
cout << s << endl;
ParseString(s);
cout << s << endl;
return 0;
}