在C中反转数组

时间:2016-04-23 04:11:16

标签: c arrays

我正在尝试创建一个带有数组的程序并将其向后还原,但程序必须以三个为一组对数组执行此操作。因此,如果用户在数组中输入数字1,2,3,4,5,6,程序将输出:3,2,1,6,5,4。

当我运行当前程序时,我得到:3 2 1 4 5 6.如果有人能帮我弄清楚为什么那会很好,因为我有点困惑。

这是我的代码:

int * numbersProcessFour(int *x, int size) 
{
    int i = 0, three = 3, six = 6, nine = 9;
    if (size < 4) 
    {
        for (i; i < three; i++)
        {
            reverse_array(x, three);
            printf("%d ", x[i]);
        }
    }else if (size > 3 && size < 7) 
    {
        for (i; i < three; i++)
        {
            reverse_array(x, three);
            printf("%d ", x[i]);
        }
        for (i; i < 6; i++)
        {
            reverse_array(x, three);
            printf("%d ", x[i]);
        }
    }
    else if (size > 6 && size < 10) 
    {
        for (i; i < three; i++)
        {
            reverse_array(x, three);
            printf("%d ", x[i]);
        }
        for (i; i < 6; i++)
        {
            reverse_array(x, three);
            printf("%d ", x[i]);
        }
        for (i; i < 9; i++)
        {
            reverse_array(x, three);
            printf("%d ", x[i]);
        }
    }
}
void reverse_array(int *x, int length)
{
    int i, temp;
    for (i = 0; i<length / 2; i++)
    {
        temp = x[i];
        x[i] = x[length - i - 1];
        x[length - i - 1] = temp;
    }
}

4 个答案:

答案 0 :(得分:1)

每个3的倍数都有分支,效率很低。解决这个问题的一种方法是你可以将数组拆分为3个较小的数组,然后反转它们。另外,反转3个元素的数组与交换第1个和第3个元素相同。

int i;
int temp;
for (i = 0; i < count; i += 3) {
    if (i+2 >= count)
        break;
    temp = arr[i];
    arr[i] = arr[i+2];
    arr[i+2] = temp;
}

答案 1 :(得分:1)

numberProcessFour的通用版本可能如下所示。

int reverse_array_mod(int *input, size_t size, int mod)
{
        int i, smod;

        /* Error: return modulus if size cannot be divided by mod */
        if(size%mod)
                return size%mod;

        smod = size/mod;

        for(i=0; i<smod; i++)
                reverse_array(input+i*mod, mod);

        /* return 0 on success */
        return 0;
}

测试

int main(int argc, char **argv)
{
        int a[] = {0, 1, 2, 3, 4, 5};
        int i, err, mod;

        for(mod=1; mod<5; mod++) {
                err = reverse_array_mod(a, 6, mod);
                if(err) {
                        fprintf(stderr, "Error %d, modulus %d invalid\n", err, mod);
                        return err;
                }

                for(i=0; i<6; i++)
                        printf("%d\n", a[i]);
                printf("\n");
        }

        return 0;
}

结果:

0
1
2
3
4
5

1
0
3
2
5
4

3
0
1
4
5
2

Error 2, modulus 4 invalid

答案 2 :(得分:1)

继续从你的评论到fluter的答案,你可能会过度思考它。为了交换数组的每个3元素分区中的第1个和第3个元素,您只需要一次遍历数组3个元素。您需要决定如何处理任何最终的部分分区,但由于您的目标是交换第1和第3个分区,因此在完全分区中没有第3个,因此逻辑选择是忽略任何最终的部分分区。

您和Fluter使用swap合并的变体将是:

/* reverse 1st and 3rd element in each group of 3 */
void rev3 (int *a, size_t sz)
{
    if (sz < 3) return;
    size_t i;

    for (i = 0; i < sz; i += 3) {
        if (sz - i < 3) break;
        swap (&a[i], &a[i+2]);
    }
}

你可以把它放在一起:

#include <stdio.h>

void rev3 (int *a, size_t sz);
void swap (int *a, int *b);

int main (void) {

    int a[] = {1,2,3,4,5,6,7,8,9};
    size_t i;

    rev3 (a, sizeof a/sizeof *a);

    for (i = 0; i < sizeof a/sizeof *a; i++) printf (" %2d", a[i]);
    putchar ('\n');

    return 0;
}

void swap (int *a, int *b)
{
    int t = *a;
    *a = *b;
    *b = t;
}

使用示例

编译并运行时,它将为您提供在问题中指定的整个数组中第1个和第3个元素的交换(反转)。

$ ./bin/revarr3
  3  2  1  6  5  4  9  8  7

使用单独的swap或是否在撤消功能中包含该操作没有区别。当程序方法起作用时,也不需要额外听到调用递归函数。查看所有答案,比较/对比实现目标的不同方法。

答案 3 :(得分:0)

试试这个

    if( x < min ) {
previousMin = min;
min = x;      <----- I was after if i could have a 2nd statement