螺丝螺母比较

/**
 * 螺丝螺母匹配,螺丝螺丝之间不能比较,螺母螺母之间不能比较
 * 只有螺丝螺母之间能比较
*/
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;
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值