以C排序数组边缘的小元素,中间的大元素

问题描述

在数组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++;
    }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...