问题描述
在数组a(n)中,将最小的元素放在第一位,将其余元素的最小放在最后,第二个放在第二个,倒数第二个,依此类推。 -直到数组的中间。 3 6 1 8 5 ---> 1 5 8 6 3 首先,我假设需要按照升序对数组进行排序,然后,如果排序后的数组中的元素编号为偶数,则将其重写为新数组的开头,如果为奇数,则到最后。但是我不知道该怎么做。也许这个问题需要以不同的方式解决。请帮助
解决方法
如果已经对数组进行了排序,则可以将数据与以下内容进行交织:
#include <stdio.h>
int
main(void)
{
int a[] = { 1,2,3,4,5,6};
size_t n = sizeof a / sizeof *a;
int b[n];
int *s = b,*e = b + n;
for( size_t i = 0; i < n; i++ ) {
*( i % 2 ? --e : s++ ) = a[i];
}
for( size_t i = 0; i < n; i++ ) {
printf("b[%zu] = %d\n",i,b[i]);
}
return 0;
}
换句话说,从数组的开头的一个指针开始,在数组的结尾的一个指针开始。遍历源数组,将值插入目标中的适当位置。
,如果对数组进行了排序,并且允许您返回一个新数组,而不是就地修改当前数组,那将非常简单。
只需一个简单的循环就可以遍历数组。保留三个索引:第一个数组中的一个索引i
向前;新数组中的一个索引j
,向前;新数组中的一个索引k
,向后移动。
source = { 1 2 3 4 5 6 7 }
^i
dest = { }
^j ^k
source = { 1 2 3 4 5 6 7 }
^i
dest = { 1 3 2 }
^j ^k
source = { 1 2 3 4 5 6 7 }
^i
dest = { 1 3 5 7 6 4 2 }
^k ^j
代码:
void permutationAlternate(int *dest,int const *source,size_t size)
{
size_t i,j,k;
i = 0;
j = 0;
k = size - 1;
while (i < size)
{
dest[j] = source[i];
j++;
i++;
dest[k] = source[i];
k--;
i++;
}
}