使用迭代加深方法:
public static void main(String[] args) {
String[] input = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
"l", "m", "n", "o"};
String[] output = resequence(input);
System.out.println(Arrays.asList(output));
}
private static String[] resequence(String[] input) {
List<String> output = new ArrayList<>();
for (int depth = 0; output.size() != input.length; ++depth) {
iteration(input, 0, input.length, depth, 0, output);
}
return output.toArray(new String[output.size()]);
}
private static void iteration(String[] input, int min, int max,
int target, int depth, List<String> output) {
if (min < max) {
int middle = (min+max)/2;
if (target == depth) {
output.add(input[middle]);
} else {
iteration(input, min, middle, target, depth+1, output);
iteration(input, middle+1, max, target, depth+1, output);
}
}
}
但是这个输出是:
[h, d, l, b, f, j, n, a, c, e, g, i, k, m, o]
更新
使用广度优先方法:
static class Interval {
private final int min;
private final int max;
Interval(int min, int max) {
this.min = min;
this.max = max;
}
}
private static String[] resequence(String[] input) {
List<String> output = new ArrayList<>();
if (input.length > 0) {
List<Interval> queue = new ArrayList<>();
queue.add(new Interval(0, input.length));
while (!queue.isEmpty()) {
Interval ival = queue.remove(0);
int middle = (ival.min+ival.max)/2;
output.add(input[middle]);
if (middle > ival.min) {
queue.add(new Interval(ival.min, middle));
}
if (middle+1 < ival.max) {
queue.add(new Interval(middle+1, ival.max));
}
}
}
return output.toArray(new String[output.size()]);
}
输出是:
[h, d, l, b, f, j, n, a, c, e, g, i, k, m, o]