贪心算法,不断提取区间里面奇数位置和偶数位置的数字,把提取出来的两组数据放在区间的前半段和后半段,一直迭代,直到区间小到只有一个或两个元素。
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
int arr[10005];
bool visited[10005];
vector<int> v1, v2;
void change(int start, int end)
{
if(end==start+1)
return;
if(end == start)
return;
int i, count, len;
v1.clear();
v2.clear();
for(i=start; i<=end; i+=2)
v1.push_back(arr[i]);
for(i=start+1; i<=end; i+=2)
v2.push_back(arr[i]);
count = start;
for(i=0; i<v1.size(); i++)
arr[count++] = v1[i];
for(i=0; i<v2.size(); i++)
arr[count++] = v2[i];
len = end-start+1;
if(len%2 == 0)
{
change(start, start+len/2-1);
change(start+len/2, end);
}
else
{
change(start, start+(len+1)/2-1);
change(start+(len+1)/2, end);
}
}
void func(int n)
{
int i;
for(i=0; i<=n-1; i++)
arr[i] = i;
change(0, n-1);
printf("%d:", n);
for(i=0; i<=n-1; i++)
printf(" %d", arr[i]);
printf("\n");
}
int main(void)
{
int n;
//freopen("input.dat", "r", stdin);
while(1)
{
scanf("%d", &n);
if(!n)
break;
func(n);
}
return 0;
}