01串排序。自定义比较仿函数

本文介绍了一种针对01串的特殊排序算法,该算法首先依据字符串长度进行排序,长度相同的情况下根据1的数量排序,数量一致时再按ASCII值排序。通过C++实现并展示了完整的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目;
将01串首先按长度排序,长度相同时,按1的个数多少进行排序,1的个数相同时再按ASCII码值排序。

#include <set>
#include <iostream>
#include <string>
#include <algorithm>


#include <iterator>


using namespace std;


class Comp
{
public:
    bool operator ()(const string &sa, const string &sb)
    {
        if (sa.length() != sb.length()) return sa.length() < sb.length();
        int ca = count(sa.begin(), sa.end(), '1');
        int cb = count(sb.begin(), sb.end(), '1');


        return (ca != cb ? ca < cb : sa < sb);
    }
};


int main()
{
    multiset<string, Comp> ms;


    string str;
    while (cin >> str)
        ms.insert(str);


    copy(ms.begin(), ms.end(),
         ostream_iterator<string>(cout, "\n"));
}


### 实现带有自定义比较函数的快速排序 为了在C++中实现带自定义比较函数的快速排序,可以利用`std::sort`算法并提供一个定制化的比较逻辑。下面是一个具体的例子,在这个实例里,字符按照长度降序排列[^1]。 ```cpp #include <vector> #include <algorithm> class QkString { public: int GetLength() const; }; bool customCompare(const QkString& a, const QkString& b) { // 自定义比较逻辑:按字符长度降序排序 return a.GetLength() > b.GetLength(); } void sortWithCustomComparison(std::vector<QkString>& fileArr) { std::sort(fileArr.begin(), fileArr.end(), customCompare); } ``` 对于更通用的情况,如果想要使用标准库之外的方法来执行快速排序,并且希望加入自己的比较规则,则可以选择使用经典的快速排序模板,并传入应的比较器作为参数。这里给出一种不依赖于STL版本的快速排序实现方式: ```cpp template<typename T, typename Compare> void quickSort(T arr[], int left, int right, Compare comp) { if (left >= right) return; int i = left, j = right; T tmp = arr[left]; while (i != j) { while (comp(tmp, arr[j]) && i < j) --j; if (i < j) arr[i++] = arr[j]; while (!comp(tmp, arr[i]) && i < j) ++i; if (i < j) arr[j--] = arr[i]; } arr[i] = tmp; quickSort(arr, left, i - 1, comp); quickSort(arr, i + 1, right, comp); } ``` 在这个非成员函数模板中,通过传递不同的`Compare`对象给`quickSort()`,就可以轻松改变元素之间的对顺序[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值