C言語

【C言語】配列の要素の入れ替え処理を実装


プログラミング初心者向けの練習問題の一つとして、配列要素の入れ替えがあります。

本記事では、配列の要素の入れ替え処理をプログラムに実装する方法について解説しています。

「配列の要素の入れ替え」処理の実装方法

まずは配列の要素の入れ替え処理をどのように実装するのかについて簡単に説明します。

入れ替え用の変数を一時利用する

配列の要素の入れ替え処理は「一方の要素で他方の要素を上書きする」操作を繰り返し行うことで実装します。

ただ、これは入れ替え処理の対象となる要素間だけで行っても上手く行きません。

最初に一方の要素を上書きした時点で他方の要素が失われてしまうからです。

x[0] = x[1]; # x[0]の値をx[1]の値で上書き
x[1] = x[0]; # x[1]の値をx[0](x[1]の値で上書き済)の値で上書き
...
本来のx[0]の値が失われてしまう

これを解決するためには、一時的に利用する変数を一つ用意する必要があります。

最初に要素の上書き操作を行う前に、上書きされる要素を別途用意した変数に退避させることで何れの要素も失わずに入れ替え処理を実行できるようになります。

temp = x[0]; # x[0]の値をtempへ退避
x[0] = x[1]; # x[0]の値をx[1]の値で上書き
x[1] = temp; # x[1]の値をtemp(x[0]の値で上書き済)の値で上書き
...
要素を失うことなく入れ替え処理が完了

実際にプログラムを作成してみる

それでは、前述した実装方法を参考にプログラムを作成していきます。

実装例① 各要素の位置を一つずらす

以下に作成したサンプルプログラムを示します。使用する言語はC言語です。

#include <stdio.h>

/* 各要素の位置が一つズレるように入れ替える */
void swapelements(int data[], int length) {
  int i = 0;
  int temp = data[i];
  for (i=1; i<length; i++) {
    data[i-1] = data[i];
  }
  data[length-1] = temp;
}

int main(void){

  int data[] = {0, 1, 2, 3, 4};
  int length = 5;

  /* 入れ替え前の配列の各要素を表示する */
  printf("Before : ");
  for(int i=0; i<length; i++){
    printf("%d ",data[i]);
  }

  /* 配列要素の入れ替えを行う関数を実行する */
  swapelements(data, length);

  /* 入れ替え後の配列の各要素を表示する */
  printf("\nAfter  : ");
  for(int i=0; i<length; i++){
    printf("%d ",data[i]);
  }

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

Before : 0 1 2 3 4 
After  : 1 2 3 4 0 

実装例② 各要素の位置を反転させる

以下に作成したサンプルプログラムを示します。使用する言語はC言語です。

#include <stdio.h>

/* 各要素の位置を先頭と末尾で反転させるように入れ替える */
void swapelements(int data[], int length) {
  int num = length / 2;
  for (int i=0; i<num; i++) {
    int temp;
    temp = data[i];
    data[i] = data[length-i-1];
    data[length-i-1] = temp;
  }
}

int main(void){

  int data[] = {0, 1, 2, 3, 4};
  int length = 5;

  /* 入れ替え前の配列の各要素を表示する */
  printf("Before : ");
  for(int i=0; i<length; i++){
    printf("%d ",data[i]);
  }

  /* 配列要素の入れ替えを行う関数を実行する */
  swapelements(data, length);

  /* 入れ替え後の配列の各要素を表示する */
  printf("\nAfter  : ");
  for(int i=0; i<length; i++){
    printf("%d ",data[i]);
  }

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

Before : 0 1 2 3 4 
After  : 4 3 2 1 0 

実装例③ 2つの配列間で要素を入れ替える

以下に作成したサンプルプログラムを示します。使用する言語はC言語です。

#include <stdio.h>

/* 配列間で要素の入れ替えを行う */
void swapelements(int dataA[], int dataB[], int length) {
  for (int i=0; i<length; i++) {
    int temp;
    temp = dataA[i];
    dataA[i] = dataB[i];
    dataB[i] = temp;
  }
}

int main(void){

  int dataA[] = {0, 1, 2, 3, 4};
  int dataB[] = {5, 6, 7, 8, 9};
  int length = 5;

  /* 入れ替え処理前の配列を表示する */
  printf("Before : \n dataA -> ");
  for(int i=0; i<length; i++){
    printf("%d ",dataA[i]);
  }
  printf("\n dataB -> ");
  for(int i=0; i<length; i++){
    printf("%d ",dataB[i]);
  }

  /* 配列要素の入れ替えを行う関数を実行する */
  swapelements(dataA, dataB, length);

  /* 入れ替え処理後の配列を表示する */
  printf("\nAfter : \n dataA -> ");
  for(int i=0; i<length; i++){
    printf("%d ",dataA[i]);
  }
  printf("\n dataB -> ");
  for(int i=0; i<length; i++){
    printf("%d ",dataB[i]);
  }

  return 0;
}

このプログラムを実行すると以下の出力結果が得られます。

Before : 
 dataA -> 0 1 2 3 4 
 dataB -> 5 6 7 8 9 
After : 
 dataA -> 5 6 7 8 9 
 dataB -> 0 1 2 3 4