次のように配列を並べ替える関数を書きたいと思います。次のようなバイナリ ツリーが与えられた場合 (対称性を維持するために 16 進数で表記):
0
1
2 3
4 5 6 7
8 9 A B C D E F
バックトラッキングアルゴリズムに従って数値を取得したいと思います:
[0,1,2,4,8,9,5,A,B,3,6,C,D,7,E,F]
私はすでに C 関数を書きましたが、よりクリーンで高速な再帰的な方法があると確信しています。これが私のコードです:
void bin_perm(float* data, float* bprm, size_t size) {
bprm[0] = data[0];
size_t j = 1;
size_t i = 1;
while (j < size) {
while (i < size) {
bprm[j++] = data[i];
i *= 2;
}
i = i / 2 + 1;
while (i % 2 == 0) {
i /= 2;
}
}
}