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

【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²) となるため、大量のデータを扱う場合にはクイックソートやマージソートなど、より効率的なアルゴリズムを選ぶのが一般的です。ただし、学習用途や小規模なデータの整列には十分実用的であり、ソートアルゴリズムの基礎を理解するうえで最適な題材といえます。

  1. C言語で単方向リンクリストを使って数値を逆順に表示する方法

    リンクリスト(連結リスト)とは リンクリストは動的メモリ割り当てを利用するデータ構造で、複数の「ノード」が連なった集合体です。各ノードはデータ部分とリンク部分(次のノードへのポインタ)の2つの要素で構成されています。 リンクリストの種類 C言語で扱われる主なリンクリストには、以下の4種類があります。 単方向リンクリスト 双方向リンクリスト 循環単方向リンクリスト 循環双方向リンクリスト 単方向リンクリストの構造 下の図は、単方向リンクリストの構造を示したものです。各ノードがデータと次ノードへのポインタを持ち、末尾ノードのポインタはNULLを指します。 数値を逆順に表示するCプログラム 以

  2. 非再帰関数を使って2つの整数の最大公約数(GCD)を求めるCプログラム

    問題与えられた2つの整数について、非再帰関数を用いて最大公約数(GCD:Greatest Common Divisor)を求めます。解決策最大公約数を求める最も一般的な方法は、ユークリッドの互除法です。これは「大きい方の数を小さい方の数で割った余り」と「小さい方の数」の最大公約数が、元の2つの数の最大公約数と等しくなるという性質を利用したものです。この性質を関数として実装することで、繰り返し処理によって効率よくGCDを計算できます。以下では、非再帰的なアプローチで2つの整数の最大公約数を求める手順を説明します。アルゴリズム非再帰関数を使って2つの整数の最大公約数(GCD)を求めるためのアルゴリ