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

C#で学ぶ挿入ソート(Insertion Sort)の基本と実装方法

挿入ソートとは

挿入ソート(Insertion Sort)は、配列から要素を1つずつ取り出し、その要素を配列内の正しい位置に挿入していくソートアルゴリズムです。この処理を繰り返すことで、最終的に配列全体が昇順に並べ替えられます。トランプの手札を整理するイメージに近く、直感的に理解しやすいのが特徴です。

以下は、C#で挿入ソートを実装したサンプルプログラムです。

サンプルコード

using System;
namespace InsertionSortDemo {
    class Example {
        static void Main(string[] args) {
            int[] arr = new int[10] { 23, 9, 85, 12, 99, 34, 60, 15, 100, 1 };
            int n = 10, i, j, val, flag;
            Console.WriteLine("Insertion Sort");
            Console.Write("Initial array is: ");
            for (i = 0; i < n; i++) {
                Console.Write(arr[i] + " ");
            }
            for (i = 1; i < n; i++) {
                val = arr[i];
                flag = 0;
                for (j = i - 1; j >= 0 && flag != 1; ) {
                    if (val < arr[j]) {
                        arr[j + 1] = arr[j];
                        j--;
                        arr[j + 1] = val;
                    }
                    else flag = 1;
                }
            }
            Console.Write("\nSorted Array is: ");
            for (i = 0; i < n; i++) {
                Console.Write(arr[i] + " ");
            }
        }
    }
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

Insertion Sort
Initial array is: 23 9 85 12 99 34 60 15 100 1
Sorted Array is: 1 9 12 15 23 34 60 85 99 100

プログラムの解説

ここからは、上記のプログラムがどのように動作しているのかを順番に見ていきましょう。

1. 配列の初期化と初期状態の表示

まず、配列を初期化し、forループを使ってその内容をコンソールに出力します。該当するコードは以下の通りです。

int[] arr = new int[10] { 23, 9, 85, 12, 99, 34, 60, 15, 100, 1 };
int n = 10, i, j, val, flag;
Console.WriteLine("Insertion Sort");
Console.Write("Initial array is: ");
for (i = 0; i < n; i++) {
    Console.Write(arr[i] + " ");
}

2. ソート処理の本体

実際の並べ替え処理は、入れ子になったforループによって行われます。外側のループの各パスでは、現在注目している要素(val)を取り出し、それより前の整列済み部分の中で適切な位置へと挿入していきます。挿入すべき位置が見つかるまで、後ろの要素を1つずつずらしながら比較を続けます。この処理を全要素に対して繰り返すことで、配列全体がソートされます。

for (i = 1; i < n; i++) {
    val = arr[i];
    flag = 0;
    for (j = i - 1; j >= 0 && flag != 1; ) {
        if (val < arr[j]) {
            arr[j + 1] = arr[j];
            j--;
            arr[j + 1] = val;
        } else flag = 1;
    }
}

変数flagは、挿入位置が確定した時点で内側のループを早期に抜けるためのフラグとして機能しています。これにより、無駄な比較を減らし、効率的な動作を実現しています。

3. ソート結果の表示

最後に、並べ替えが完了した配列をコンソールに出力します。該当するコードは以下の通りです。

Console.Write("\nSorted Array is: ");
for (i = 0; i < n; i++) {
    Console.Write(arr[i] + " ");
}

まとめ

挿入ソートは、計算量がO(n²)とデータ数が多い場合には非効率になりますが、実装がシンプルで、ほぼ整列済みのデータに対しては高速に動作するという利点があります。アルゴリズムの基礎を学ぶうえで非常に良い題材なので、ぜひ自分でもコードを書いて動作を確認してみてください。

  1. Pythonで挿入ソート(Insertion Sort)を実装する方法:アルゴリズムとサンプルコードを徹底解説

    この記事では、Python 3.x(およびそれ以前のバージョン)における挿入ソートの実装方法について詳しく解説します。挿入ソートは、トランプの手札を整理するイメージに近い、直感的で理解しやすいソートアルゴリズムです。挿入ソートのアルゴリズム挿入ソートは以下の手順で動作します。入力要素を順番に走査し、各反復ごとにソート済みの配列部分を少しずつ拡張していきます。現在注目している要素(キー)を、ソート済み部分の中で最も大きい値と比較します。キーがその値より大きければ、要素は元の位置のまま次の要素へ進みます。そうでなければ、ソート済み配列内の正しい位置を探し出し、そこへ移動させます。具体的には、ソート

  2. Rubyで学ぶ挿入ソート:仕組みから計算量まで徹底解説

    ※本記事は、Rubyでさまざまなソートアルゴリズムを実装するシリーズの第4回です。第1回ではバブルソート、第2回では選択ソート、第3回ではマージソートを取り上げました。データのソート手法をさまざまな角度から探っていくシリーズもいよいよ折り返し地点。今回は挿入ソート(Insertion Sort)に焦点を当てます。挿入ソートには魅力的な特徴がたくさんあります。まず、挿入ソートは安定(stable)なアルゴリズムです。つまり、同じキーを持つ要素同士の相対的な順序が入れ替わることがありません。また、インプレース(in-place)アルゴリズムでもあるため、ソート結果を保存するための新しい配列を作成す