请教一个C++的数字和字符混合排序的算法
请教一个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应该放在哪里呢?谢谢了先!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不用 inplace (直接分成两个数组排序,再合并) 的话就太简单了,要 inplace 的话其实也可以不用手写 iterator,手写一个 reference 的 wrapper 就行了(然后直接调用任意 常规 inplace 排序算法即可):
测试:
输入
2 Banana 1 Apple 3 Pear
输出
1 Apple 2 Banana 3 Pear
我的想法是先用一个数组标注对应的位置是数字还是字符串,例如对 [2, Banana, 1, Apple, 3, Pear],有[0,1,0,1,0,1],然后把数字和字符串分别排序放到两个数组nums和strings里,然后按照表示数组放入合适的元素。
这道题主要思路是要用原址排序,例如快排,
我这里实现了自定义的迭代器,然后用std::sort排序,你也可以自己实现快排,当然可能更简单一些,不过要小心边界。