/**
* 螺丝螺母匹配,螺丝螺丝之间不能比较,螺母螺母之间不能比较
* 只有螺丝螺母之间能比较
*/
template <typename A, typename B>
class ABSorter {
public:
typedef function<int(const A&, const B&)> cmp_type;
ABSorter(cmp_type cmp) : _cmp(cmp){}
void sort(vector<A>& arr_a, vector<B>& arr_b) {
__sort(arr_a, 0, arr_a.size()-1, arr_b, 0, arr_b.size()-1);
}
private:
void __sort(vector<A>& arr_a, size_t al, size_t ar,
vector<B>& arr_b, size_t bl, size_t br) {
if (al >= ar || bl >= br) {
return;
}
auto pivot = partition(arr_a, al, ar, arr_b, bl, br);
size_t pivot_a = pivot.first;
size_t pivot_b = pivot.second;
__sort(arr_a, al, pivot_a-1, arr_b, bl, pivot_b-1);
__sort(arr_a, pivot_a+1, ar, arr_b, pivot_b+1, br);
}
std::pair<size_t, size_t> partition(vector<A>& arr_a, size_t al, size_t ar,
vector<B>& arr_b, size_t bl, size_t br) {
B pivot = arr_b[br];
size_t index_a = al-1;
size_t index_eq = al-1;
for (size_t i =al; i <= ar; ++i) {
if (_cmp(arr_a[i], pivot) <= 0) {
++index_a;
std::swap(arr_a[i], arr_a[index_a]);
if (_cmp(arr_a[index_a], pivot) == 0) {
index_eq = index_a;
}
}
}
//一定满足index_eq>al,即有效,因为arr_a中每一个元素都与arr_b对应
if (index_a != index_eq) {
std::swap(arr_a[index_a], arr_a[index_eq]);
}
A pivot_b = arr_a[index_a];
size_t index_b = bl-1;
for (size_t i =bl; i < br; ++i) {
if (_cmp(pivot_b, arr_b[i]) >= 0) {
std::swap(arr_b[i], arr_b[++index_b]);
}
}
std::swap(arr_b[++index_b], arr_b[br]);
return make_pair(index_a, index_b);
}
cmp_type _cmp;
};
螺丝螺母比较
最新推荐文章于 2024-04-25 07:38:35 发布