题目
思路 :
-
从bolts中取出一个bolt 去 partition nuts 得到匹配的一对nut和bolt,nut在nuts中的索引为q,在nuts中,q左半部分为均为小于nuts[p]的N1, 右半部分为N2.
-
拿nuts[q] partition bolts 得到bolt在bolts中的索引也为q,同上q左半部分为均小于bolts[q]的B1,右半部分为B2.
-
同1和2的递归地处理(N1,B1)和(N2,B2),最终nuts和bolts都会排序好,自然就匹配了。
-
一些tricky的地方:在每次partition之前,先遍历一遍bolts或nuts,找到与用来partition的nut或bolt相匹配的key,并将key和lo调换位置,如此在partition的时候才可以保证最终key在正确的位置。
代码
import edu.princeton.cs.algs4.StdRandom;
public class NutsAndBolts {
private static class items {
public Comparable []nuts;
public Comparable []bolts;
public items (Comparable []nut, Comparable []bolt) {
nuts = nut;
bolts = bolt;
}
}
private static boolean less(Comparable x, Comparable y) {
return x.compareTo(y) < 0;
}
private static void swap