思路是参考大神的,我就不说什么了,其实看代码很明白,但是自己想就不一定能想出来,还是缺乏思维锻炼啊。。。
二分的时候一定要注意下表和数组界限的关系,保证每次都是均分,有时候数据过了只是表面现象。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <stdio.h>
#include <string.h>
#define MAX 10010
using namespace std;
int array[MAX];
int temp[MAX];
void divide( int begin, int end )
{
int i, j;
if( end - begin <= 1 ) return ;
for( i = begin; i < end; i++ )
temp[i] = array[i];
for( i = begin, j = begin; j < end; j+=2, i++ )
array[i] = temp[j];
for( j = begin+1; j < end; j+=2, i++ )
array[i] = temp[j];
divide( begin, (end+begin+1)/2 );
divide( (end+begin+1)/2, end );
};
int main()
{
int n;
while( scanf( "%d", &n ) && n )
{
for( int i = 0; i < n; i++ )
array[i] = i;
divide( 0, n );
printf( "%d:", n );
for( int i = 0; i < n; i++ )
printf( " %d", array[i] );
printf( "\n" );
}
return 0;
}