はじめに
今日のインターネット社会では、コーディング能力は非常に求められるスキルの一つとなりました。
特に、C言語はそのパワフルさと汎用性から広く利用されています。
ここでは、初心者でも理解しやすいように、C言語を用いて配列を昇順に並び替える方法をステップバイステップで詳しく解説します。
明確で詳細なサンプルコードと共に、一緒にプログラミングのスキルを磨いていきましょう。
●C言語について
○C言語の特徴
C言語は、高速で効率的なプログラムを作成することが可能な汎用プログラミング言語です。
ポータビリティが高く、システムレベルからアプリケーションレベルまで、幅広い用途で利用されています。
また、C言語は他の多くのプログラミング言語の基盤ともなっており、C言語の理解はプログラミングスキル全般を深めるための重要なステップとなります。
○C言語での配列とは
C言語の配列とは、同じ型のデータを連続的に格納できるデータ構造のことを指します。
配列の各要素はインデックスまたは添字でアクセスすることができ、この添字は0から始まります。
例えば、サイズが5の整数型配列は、5つの整数値を格納でき、それぞれのインデックスは0から4までの値となります。
●昇順並び替えの基本
○昇順とは
昇順とは、数値またはアルファベット等を小さいものから大きいものへと順に並べることを指します。
例えば、数値の配列が[3, 1, 4, 1, 5]であった場合、これを昇順に並び替えると[1, 1, 3, 4, 5]となります。
○昇順並び替えのアルゴリズム
昇順に並び替える一般的なアルゴリズムは、バブルソート、選択ソート、挿入ソートなどがあります。
これらのアルゴリズムは全て、配列の要素を比較し、必要に応じてその位置を交換するという基本的なアイデアに基づいています。
●C言語での昇順並び替えの方法
ここからは具体的なC言語のコードを用いて、配列を昇順に並び替える方法を見ていきましょう。
○サンプルコード1:基本的な昇順並び替え
このコードでは、バブルソートを用いて整数の配列を昇順に並び替える方法を紹介します。
この例では、配列の各要素を隣接する要素と比較し、大きな場合には位置を交換しています。
#include <stdio.h>
void bubble_sort(int a[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = n - 1; j > i; j--) {
if (a[j - 1] > a[j]) {
int tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
}
}
}
}
int main(void) {
int array[] = {3, 1, 4, 1, 5};
int n = sizeof(array) / sizeof(array[0]);
bubble_sort(array, n);
for (int i = 0; i < n; i++) {
printf("%d ", array[i]);
}
return 0;
}
上記のコードを実行すると、結果として”[1, 1, 3, 4, 5]”という昇順に並び替えられた配列が出力されます。
バブルソートのアルゴリズムはシンプルですが、その実装は配列の理解を深め、アルゴリズムの基本的な理解に役立ちます。
○サンプルコード2:ユーザー入力による昇順並び替え
より実用的なケースを考慮に入れると、ユーザーからの入力を並び替えることがよくあります。
下記のコードは、ユーザーが入力した一連の数値を昇順に並び替える方法を表しています。
#include <stdio.h>
int main() {
int array[100], n, c, d, swap;
printf("配列の要素数を入力してください:\n");
scanf("%d", &n);
printf("%d個の数値を入力してください:\n", n);
for (c = 0; c < n; c++)
scanf("%d", &array[c]);
for (c = 0; c < n-1; c++)
for (d = 0; d < n-c-1; d++)
if (array[d] > array[d+1]) {
swap = array[d];
array[d] = array[d+1];
array[d+1] = swap;
}
printf("昇順に並び替えた結果:\n");
for (c = 0; c < n; c++)
printf("%d\n", array[c]);
return 0;
}
このコードでは、まずユーザーに配列の要素数を入力してもらいます。
それから、指定した要素数分だけ数値をユーザーに入力してもらいます。
これらの数値は、初めに宣言した配列に格納されます。
次に、バブルソートアルゴリズムを用いて数値を昇順に並び替えます。
これは2つのループを使用して行われ、一つ目のループは全体の配列を通過するためのもの、二つ目のループは隣接する要素を比較し、必要に応じてスワップするためのものです。
最後に、並び替えられた配列を出力します。
これで、ユーザーが入力した数値が昇順に並び替えられた結果が得られます。
なお、このコードを実行したときの結果は、入力された数値によりますが、例えばユーザーが5, 3, 8, 1, 6と入力した場合、出力結果は1, 3, 5, 6, 8となるでしょう。
○サンプルコード3:二次元配列の昇順並び替え
C言語では一次元配列だけでなく、二次元配列も扱うことができます。
二次元配列は行と列からなる表のようなもので、例えばスプレッドシートを思い浮かべるとわかりやすいでしょう。
下記のコードでは、二次元配列の全要素を昇順に並び替えています。
ここでは3×3の二次元配列を例に取ります。
#include <stdio.h>
void swap(int *xp, int *yp) {
int temp = *xp;
*xp = *yp;
*yp = temp;
}
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j] > arr[j+1]) {
swap(&arr[j], &arr[j+1]);
}
}
}
}
int main() {
int arr[3][3] = {{9, 5, 2}, {8, 6, 3}, {7, 4, 1}};
int n = sizeof(arr) / sizeof(arr[0][0]);
bubbleSort((int *)arr, n);
printf("Sorted 2D array is:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
このコードでは、まずスワップ関数とバブルソート関数を定義しています。
それぞれの要素を比較して、条件に合致すればスワップします。
このバブルソート関数は、後のメイン関数で使用します。
メイン関数では、初めに3×3の二次元配列を定義し、次に配列の全要素数を計算します。
そして、この二次元配列を一次元配列としてバブルソート関数に渡します。
最後に、並び替えた結果を出力します。
二次元配列の全要素が昇順に並び替えられていることが確認できます。
このコードを実行すると、次のような出力結果が得られます。
Sorted 2D array is:
1 2 3
4 5 6
7 8 9
以上のように、C言語では様々なタイプの配列を昇順に並び替えることが可能です。
サンプルコードを実行してみると、その機能をより理解しやすくなるでしょう。
●C言語の昇順並び替えの応用
基本的な昇順並び替えをC言語で理解したら、さらなる応用が可能になります。
具体的には、構造体の配列の並び替えや、文字列の昇順並び替えなどが挙げられます。
それぞれの詳細とサンプルコードを見ていきましょう。
○サンプルコード4:構造体の配列の昇順並び替え
構造体の配列を昇順に並び替える際には、構造体の特定の要素に着目して並び替えを行います。
このサンプルコードでは、生徒の点数を持つ構造体を使って、点数の昇順に並び替えるコードを紹介します。
#include <stdio.h>
typedef struct {
char name[20];
int score;
} Student;
void swap(Student *x, Student *y) {
Student temp = *x;
*x = *y;
*y = temp;
}
void bubbleSort(Student arr[], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (arr[j].score > arr[j+1].score) {
swap(&arr[j], &arr[j+1]);
}
}
}
}
int main(void) {
Student arr[3] = {
{"Yamada", 70},
{"Suzuki", 80},
{"Tanaka", 60}
};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%s %d\n", arr[i].name, arr[i].score);
}
return 0;
}
このコードでは、構造体Studentを使って生徒の名前と点数を持っています。
そして、swap関数とbubbleSort関数を使って、配列の要素(生徒)を点数の昇順に並び替えています。
この例では、”Yamada”が70点、”Suzuki”が80点、”Tanaka”が60点として、最終的には”Tanaka”、”Yamada”、”Suzuki”の順に昇順に並び替えています。
このように、構造体の配列でも基本的な考え方は同じで、比較対象とする要素を変更するだけで簡単に応用できます。
○サンプルコード5:文字列の昇順並び替え
C言語では、文字列も配列として扱うことができます。そこで、文字列の昇順並び替えを考えてみましょう。
ここでは、strcmp関数を用いて文字列を比較し、昇順に並び替えるサンプルコードを紹介します。
#include <stdio.h>
#include <string.h>
void swap(char *x, char *y) {
char temp[20];
strcpy(temp, x);
strcpy(x, y);
strcpy(y, temp);
}
void bubbleSort(char arr[][20], int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n-i-1; j++) {
if (strcmp(arr[j], arr[j+1]) > 0) {
swap(arr[j], arr[j+1]);
}
}
}
}
int main(void) {
char arr[3][20] = {"Peach", "Apple", "Orange"};
int n = sizeof(arr)/sizeof(arr[0]);
bubbleSort(arr, n);
for (int i = 0; i < n; i++) {
printf("%s\n", arr[i]);
}
return 0;
}
このコードでは、”Peach”、”Apple”、”Orange”という文字列を持つ配列を昇順に並び替えています。
文字列の比較にはstrcmp関数を使っており、strcmp関数は2つの文字列を比較して、一方が他方よりも辞書順で前に来る場合は負の値、同じ場合は0、後に来る場合は正の値を返します。
そのため、strcmp関数の結果が0より大きい場合、すなわちarr[j]がarr[j+1]よりも辞書順で後ろに来る場合に交換を行うことで昇順に並び替えています。
この例では、最終的に”Apple”、”Orange”、”Peach”の順に昇順に並び替えています。
これまでに学んだ昇順並び替えの基本的な考え方を理解していれば、構造体や文字列などの少し複雑なデータ構造でも昇順に並び替えることができます。
繰り返しですが、重要なのは比較対象となる要素を適切に選び、それを用いて交換操作を行うことです。
●注意点と対処法
昇順に並び替えを行う際には、いくつかの注意点があります。
まず、バブルソートは計算量がO(n^2)と大きいため、大量のデータに対しては他の効率的なソートアルゴリズム(例えば、クイックソートやマージソート)を検討した方が良いかもしれません。
また、構造体の配列を並び替える際には、交換する要素が大きいと時間がかかる可能性があります。
その場合、ポインタを使用してデータの参照を交換することで、効率を改善することができます。
最後に、文字列の比較は、大文字と小文字が区別されます。
つまり、’A’は’a’よりも辞書順では前に来ます。
これを無視して大文字小文字を区別せずに比較する場合には、strcasecmp関数(Windowsでは_stricmp関数)を使用すると良いでしょう。
まとめ
この記事では、C言語で配列を昇順に並び替える5つのステップを紹介しました。
まず、C言語と配列について基本を理解し、次に昇順並び替えのアルゴリズムを学びました。
そして、基本的な昇順並び替えから始めて、ユーザー入力による昇順並び替え、二次元配列の昇順並び替え、そして構造体の配列や文字列の昇順並び替えと、段階を踏んで応用的な昇順並び替えを学びました。
C言語の配列を昇順に並び替える方法は、他のプログラミング言語でも同じような思考が必要となるため、非常に重要な知識です。
今後もC言語の学習を続け、より高度なプログラミングスキルを身につけていきましょう。