【C言語】バブルソートで数値リストを昇順にソートするプログラムの書き方
C言語におけるバブルソート(bubble sort)は、最もシンプルなソート手法の一つです。「交換ソート(exchange sort)」と呼ばれることもあります。
バブルソートの手順
リストの先頭要素を残りの要素と順番に比較し、順序が正しくなければ要素を入れ替えます。
この操作をリスト内のすべての要素が整列するまで繰り返します。
隣り合う要素を繰り返し比較・交換することで、大きい値がリストの後方へ「浮かび上がる」ように移動していくため、泡(bubble)が水面へ昇っていく様子になぞらえて「バブルソート」と名付けられています。
アルゴリズム
以下は、バブルソートの手法を使って、与えられた数値リストを昇順にソートするためのアルゴリズムです。
ステップ1 - 開始
ステップ2 - リスト(配列)list と要素数 num を用意する
ステップ3 - readlist(list, num) を呼び出す
ステップ4 - printlist(list, num) を呼び出す
ステップ5 - bub_sort(list, num) を呼び出す
ステップ6 - printlist(list, num) を呼び出す
ステップ7 - 終了
readlist(list, num)
1. j = 0 から num まで繰り返す 2. list[j] を読み込む
printlist(list, num)
1. j = 0 から num まで繰り返す 2. list[j] を表示する
bub_sort(list, num)
1. i = 0 から num まで繰り返す 2. j = 0 から (num − i) まで繰り返す 3. もし ( list[j] > list[j+1] ) ならば 4. swapList( &list[j], &list[j+1] ) を呼び出す
swapList(address of list[j], address of list[j+1])
1. temp = list[j] の値 2. list[j] = list[j+1] の値 3. list[j+1] = temp の値
C言語による実装例
次は、バブルソートを使って数値リストを昇順にソートするCプログラムです。
#include <stdio.h>
#define MAX 10
void swapList(int *m,int *n){
int temp;
temp = *m;
*m = *n;
*n = temp;
}
/* バブルソートを行う関数 */
void bub_sort(int list[], int n){
int i,j;
for(i=0;i<(n-1);i++)
for(j=0;j<(n-(i+1));j++)
if(list[j] > list[j+1])
swapList(&list[j],&list[j+1]);
}
void readlist(int list[],int n){
int j;
printf("\nEnter the elements: \n");
for(j=0;j<n;j++)
scanf("%d",&list[j]);
}
/* リストの内容を表示する関数 */
void printlist(int list[],int n){
int j;
for(j=0;j<n;j++)
printf("%d\t",list[j]);
}
void main(){
int list[MAX], num;
printf(" Enter the number of elements \n");
scanf("%d",&num);
readlist(list,num);
printf("\n\nElements in the list before sorting are:\n");
printlist(list,num);
bub_sort(list,num);
printf("\n\nElements in the list after sorting are:\n");
printlist(list,num);
}
実行結果
上記のプログラムを実行すると、次のような結果が出力されます。
Enter the number of elements 10 Enter the elements: 11 23 45 1 3 6 35 69 10 22 Elements in the list before sorting are: 11 23 45 1 3 6 35 69 10 22 Elements in the list after sorting are: 1 3 6 10 11 22 23 35 45 69
まとめ
バブルソートは実装が非常に簡単な一方、計算量は O(n²) となるため、大量のデータを扱う場合にはクイックソートやマージソートなど、より効率的なアルゴリズムを選ぶのが一般的です。ただし、学習用途や小規模なデータの整列には十分実用的であり、ソートアルゴリズムの基礎を理解するうえで最適な題材といえます。
-
C言語で単方向リンクリストを使って数値を逆順に表示する方法
リンクリスト(連結リスト)とは リンクリストは動的メモリ割り当てを利用するデータ構造で、複数の「ノード」が連なった集合体です。各ノードはデータ部分とリンク部分(次のノードへのポインタ)の2つの要素で構成されています。 リンクリストの種類 C言語で扱われる主なリンクリストには、以下の4種類があります。 単方向リンクリスト 双方向リンクリスト 循環単方向リンクリスト 循環双方向リンクリスト 単方向リンクリストの構造 下の図は、単方向リンクリストの構造を示したものです。各ノードがデータと次ノードへのポインタを持ち、末尾ノードのポインタはNULLを指します。 数値を逆順に表示するCプログラム 以
-
非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム
問題与えられた2つの整数について、非再帰関数を用いて最大公約数(GCD:Greatest Common Divisor)を求めます。解決策最大公約数を求める最も一般的な方法は、ユークリッドの互除法です。これは「大きい方の数を小さい方の数で割った余り」と「小さい方の数」の最大公約数が、元の2つの数の最大公約数と等しくなるという性質を利用したものです。この性質を関数として実装することで、繰り返し処理によって効率よくGCDを計算できます。以下では、非再帰的なアプローチで2つの整数の最大公約数を求める手順を説明します。アルゴリズム非再帰関数を使って2つの整数の最大公約数(GCD)を求めるためのアルゴリ