您可以使用卡片形式A集合作为快速选择集合B的枢轴。因此您可以通过这种方式实现快速排序。所以从A组中选择一张牌,然后将B组分成越来越小。如果您在 B 中找到匹配的卡,您可以使用此卡来划分 A 组。如果你没有找到匹配的卡重复。如果找到,则以与快速排序相同的方式将算法应用于越来越小的组。重复直到找到所有匹配的卡片。复杂性与快速排序相同,因此在最坏情况下为 O(n^2),平均为 O(NlogN)。
Erlang 中的示例实现:
-module(abcards).
-export([find_pairs/2]).
find_pairs([], _) -> [];
find_pairs(_, []) -> [];
find_pairs([A|As], Bs) ->
case partitionB(A, Bs, [], [], not_found) of
{_, _, not_found} -> find_pairs(As, Bs);
{BLess, BMore, B} ->
{ALess, AMore} = partitionA(B, As, [], []),
[{A, B} | find_pairs(ALess, BLess) ++ find_pairs(AMore, BMore) ]
end.
card_reader(A, B) when A > B -> red;
card_reader(A, B) when A == B -> green;
card_reader(A, B) when A < B -> yellow.
partitionB(_, [], BLess, BMore, Found) -> {BLess, BMore, Found};
partitionB(A, [B|Bs], BLess, BMore, Found) ->
case card_reader(A, B) of
red -> partitionB(A, Bs, [B|BLess], BMore, Found);
green -> partitionB(A, Bs, BLess, BMore, B);
yellow -> partitionB(A, Bs, BLess, [B|BMore], Found)
end.
partitionA(_, [], ALess, AMore) -> {ALess, AMore};
partitionA(B, [A|As], ALess, AMore) ->
case card_reader(A, B) of
red -> partitionA(B, As, ALess, [A|AMore]);
yellow -> partitionA(B, As, [A|ALess], AMore)
end.