Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語で配列を左にn回転させるプログラムの書き方

C言語で配列を左方向にn回転させるプログラムの書き方を解説します。配列の要素を指定した回数だけ左へシフトし、はみ出した先頭の要素を末尾に移動させる「左回転(左ローテート)」の基本的なロジックを、サンプルコードと実行例付きでわかりやすく紹介します。

入力と出力の例

入力: arr[] = 1 2 3 4 5 6 7 8 9 10
N = 3
出力: 4 5 6 7 8 9 10 1 2 3

アルゴリズムの流れ

  • まず、配列 arr に要素を格納します。
  • 回転させる回数を変数 N に設定します。
  • 「1回分の左回転」をN回繰り返します。1回分の左回転とは、配列の全要素を1つずつ左にずらし、先頭にあった要素を末尾へコピーする操作のことです。

サンプルコード(C言語)

#include <stdio.h>

int main(void) {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int i, j;
int N = 3; /* 回転回数 */
int len = sizeof(arr) / sizeof(arr[0]); /* 配列の要素数 */

/* 左に1回転させる操作をN回繰り返す */
for (i = 0; i < N; i++) {
int x = arr[0]; /* 先頭の要素を退避 */
for (j = 0; j < len - 1; j++) {
arr[j] = arr[j + 1]; /* 全要素を1つ左へシフト */
}
arr[len - 1] = x; /* 退避した要素を末尾へ */
}

/* 結果を表示 */
for (i = 0; i < len; i++) {
printf("%d\t", arr[i]);
}
return 0;
}

コードのポイント

  • 先頭要素の退避: シフトを始める前に、先頭の要素 arr[0] を一時変数 x に保存しておきます。シフト処理によって上書きされてしまうためです。
  • 左シフト: 内側の for ループで arr[j] = arr[j + 1] を実行し、全要素を1つずつ左に移動させます。ループは j < len - 1 で止めるのがポイントです。これ以上進むと配列の範囲外へアクセスしてしまいます。
  • 末尾へのコピー: シフトが完了したら、退避しておいた先頭の要素を配列の末尾 arr[len - 1] に書き込みます。
  • N回の繰り返し: 外側の for ループでこの一連の操作をN回繰り返すことで、配列全体が左にN回転します。

実行結果

4 5 6 7 8 9 10 1 2 3

計算量と補足

この方法は理解しやすい反面、計算量は O(N × len) になります。要素数や回転回数が大きい場合は、配列を区間に分けて反転させる「逆転アルゴリズム」や、最大公約数を利用した「ジョグリングアルゴリズム」を使うと O(len) で効率よく回転できます。また、回転回数 N が配列長 len より大きい場合は、事前に N = N % len としておくと無駄な繰り返しを省けます。

なお、元のコードは iostream や cout を使ったC++形式で書かれていましたが、ここでは純粋なC言語(stdio.h と printf)で書き直しています。

  1. Pythonでカウントソートを実装する方法|サンプルコード付きで解説

    この記事では、以下の問題文に対する解決策について詳しく解説します。 問題文 問題: 配列が与えられたとき、カウントソート(Counting Sort)のアルゴリズムを用いて、その配列を昇順に並べ替えます。 カウントソートとは? カウントソートは、あらかじめ決められた範囲内のキーを対象として動作する整列アルゴリズムです。まず、それぞれ異なるキー(値)を持つ要素がいくつあるかを数え上げます。その後、累積和の計算を行うことで、各要素がソート後の配列のどの位置に配置されるべきかを求め、結果を出力します。 この手法は、キーの取り得る範囲が狭い場合に特に有効で、時間計算量は O(n + k)(n は要素数

  2. Pythonでアナグラム部分文字列検索プログラムを作成する方法

    はじめに この記事では、以下の問題文に対する解決策について学びます。 問題文 − テキストとパターンが与えられたとき、テキスト内に含まれるパターンおよびその順列(アナグラム)の出現位置をすべて出力します。 例えば、テキストが「TUTORIALSPOINT」、パターンが「TOR」であれば、「ROT」や「OTR」といった並べ替えも検索対象となります。 アルゴリズムの考え方 この問題は、スライディングウィンドウ(滑動窓)と文字カウント配列を組み合わせることで効率的に解くことができます。手順は以下のとおりです。 パターン内の各文字の出現回数を、カウント配列 countP に記録します。 テキストの先