请教一个C++的数字和字符混合排序的算法。
输入是一个string array,所有元素本质上都是string,比如 [2, Banana, 1, Apple, 3, Pear]。现在给它排序,要求排序之后的输出是 [1, Apple, 2, Banana, 3, Pear]。总之就是数字与数字排序,字符与字符排序,原来是string的位置放string,是integer的位置放integer(话说回来,其实所有元素本质上都是string,只不过有些是数字形式而已)。
我觉得必须要实现一下判断字符串是否是数字。C++应该直接可以用::isdigit吧?但是请问一下,应该怎么实现原来是string的位置放string、是integer的位置放integer呢?
也许可以用堆排序来实现这个算法。所以另外再请教一个最小堆priority_queue的定义问题。
struct cmp
{
bool operator () (int a, int b)
{ return a>b; }
};
void heaping1()
{
priority_queue<int, vector<int>, cmp> pq;
这样定义priority_queue是可以通过编译的。但是,如果改为以下定义:
void heaping2()
{
priority_queue<pair<int, char>, cmp> pq;
这样定义priority_queue就无法通过编译了!当然,如果删除了cmp改为最大堆,那么一切正常。所以,请问上面函数中的最小堆应该如何定义呢?cmp应该放在哪里呢?谢谢了先!
不用 inplace (直接分成两个数组排序,再合并) 的话就太简单了,要 inplace 的话其实也可以不用手写 iterator,手写一个 reference 的 wrapper 就行了(然后直接调用任意 常规 inplace 排序算法即可):
测试:
输入
2 Banana 1 Apple 3 Pear
输出
1 Apple 2 Banana 3 Pear