配列を逆順に並び替える | Programming Place Plus C言語編 逆引き

トップページC言語編逆引き

このページの概要

以下は目次です。

目的

配列の要素を逆の順序になるように並び替えたいとします。

以下のような配列があるとして、

int array1[] = {0, 1, 2, 3, 4};
int array2[] = {0, 1, 2, 3, 4, 5};

処理を適用後、array1 は {4, 3, 2, 1, 0} の順で、 array2 は {5, 4, 3, 2, 1, 0} の順で並ぶようにします。

要素数が、奇数の場合や偶数の場合のどちらでも正しく動作するかどうかには注意が必要です。

方法①(先頭と末尾の交換を繰り返す)

先頭の要素と末尾の要素とを交換することを、範囲を縮めながら繰り返します。 つまり、要素数が 5 だとすれば、 array[0] <-> array[4]、 array[1] <-> array[3]、 array[2] <-> array[2] で交換を行います。
要素の交換については、「逆引き 変数の値を交換する」を参照してください。

#include <stdio.h>

#define SWAP(type,x,y) do{type tmp = x; x = y; y = tmp;}while(0)
#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

void reverse(int* array, size_t size)
{
    for (size_t i = 0; i < size / 2; ++i) {
        SWAP(int, array[i], array[size - i - 1]);
    }
}

void print_array(const int* array, size_t size)
{
    for (size_t i = 0; i < size; ++i) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main(void)
{
    int array1[] = {0, 1, 2, 3, 4};
    int array2[] = {0, 1, 2, 3, 4, 5};

    reverse(array1, SIZE_OF_ARRAY(array1));
    reverse(array2, SIZE_OF_ARRAY(array2));

    print_array(array1, SIZE_OF_ARRAY(array1));
    print_array(array2, SIZE_OF_ARRAY(array2));
}

実行結果:

4 3 2 1 0
5 4 3 2 1 0

要素数が奇数の場合、真ん中の要素については、自分自身との交換になります。 自分自身との交換は無意味ですが、 if文を追加してチェックすると、かえって無駄が大きいです。


参考リンク


更新履歴

’2017/5/29 新規作成。



逆引きのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る