/************************************************************************************************ 输入a_1, a_2, ..., a_n, b_1, b_2, ..., b_n,如何在O(n)的时间,用O(1)的空间, 将这个序列顺序改为a_1, b_1, ..., a_n, b_n。 1> a_1, b_1, a_3, a_4, a_5, a_6, a_2, b_2, b_3, b_4, b_5, b_6 2> a_1, b_1, a_2, a_4, a_5, a_6, a_3, b_2, b_3, b_4, b_5, b_6 ************************************************************************************************/ #include <iostream> using namespace std; void order(int* p, int size) { if( size % 2 != 0 ¦ ¦ size <= 2) // 两项以内不需要移动 return; // 首先把第二个数取出来, 这样第2项就空出来了, 然后计算应该哪一项要移到第二个位置; // 这样移动后又空出一项..., 一直计算到正好要填上得就是第二项, 结束移动 int temp = p[1]; int index = -1; // 用于保存要移到空位置得项得索引 index = size / 2; p[1] = p[index]; while(index != 1) { if(index % 2 == 0) // 需要把a中某一项移入 { p[index] = p[index / 2]; index = index / 2; } else { p[index] = p[index / 2 + size / 2]; index = index / 2 + size / 2; } } if(index == 1) p[index] = temp; else cout < < "error"; } void testOrder() { int pp[] = {101, 102, 103, 104, 105, 106, 107, 201, 202, 203, 204, 205, 206, 207}; order(pp, 14); for(int i = 0; i < 4; i++) cout < < pp[i] < < " "; } void main() { testOrder(); getchar(); } |