基礎から学ぶC#入門 90日コース | 配列・コレクション・文字列 - Day 28:データ並び替え

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 28 のゴールと全体像

Day 28 では、「配列やリストのデータを並び替える基本的な考え方」を学びます。 扱うテーマは次のとおりです。

  • 基本的な並び替えの考え方
  • 昇順(小さいものから大きいものへ)
  • 降順(大きいものから小さいものへ)

この段階では、あえてライブラリの Array.Sort や LINQ を使わず、 自分でループを書いて並び替えを体験することが大事なポイントになります。 後半で LINQ を学ぶとき、「中で何が起きているか」をイメージできるようになるための土台です。

基本的な並び替えの考え方

並び替えとは何をしているのか

並び替え(ソート)は、

「バラバラに並んでいる値を、あるルールに従って並べ直すこと」

です。

例えば、

  • { 30, 10, 50, 20 } を「小さい順」に並べると { 10, 20, 30, 50 }
  • 「大きい順」に並べると { 50, 30, 20, 10 }

というように、順番そのものを変える処理です。

並び替えの基本操作:比較と交換

並び替えの中で行っていることは、実はとてもシンプルです。

  1. 比較する
    • 2つの値を見て、「どちらが小さいか/大きいか」を判断する
  2. 交換する
    • 並び順が「ルール」に合っていなければ、2つの値の位置を入れ替える

この「比較」と「交換」を、ループの中で何度も繰り返すことで、 全体が少しずつ整った順番になっていきます。

昇順並び替え(小さい順)

まずは「バブルソート」で考え方を体験する

初心者向けに並び替えの考え方をつかむには、 バブルソート(Bubble Sort) と呼ばれるシンプルな方法が分かりやすいです。

バブルソートのイメージは、

「隣り合う 2 つを比べて、順番が逆なら入れ替える」 「これを何回も繰り返して、少しずつ正しい順番に近づける」

というものです。

昇順バブルソートのコード例

using System;

class Program
{
    static void Main(string[] args)
    {
        int[] numbers = { 30, 10, 50, 20, 40 };

        Console.WriteLine("=== 並び替え前 ===");
        PrintArray(numbers);

        // 昇順に並び替えます(バブルソート)
        BubbleSortAscending(numbers);

        Console.WriteLine("\n=== 昇順並び替え後 ===");
        PrintArray(numbers);

        Console.ReadLine();
    }

    // 昇順バブルソート
    static void BubbleSortAscending(int[] data)
    {
        int n = data.Length;

        // 外側のループ:配列全体を何回もなめる
        for (int i = 0; i < n - 1; i++)
        {
            // 内側のループ:隣り合う要素を比較して、必要なら交換する
            for (int j = 0; j < n - 1 - i; j++)
            {
                // data[j] と data[j + 1] を比較します
                if (data[j] > data[j + 1])
                {
                    // 順番が逆(左の方が大きい)なら入れ替えます
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }
        }
    }

    // 配列の中身を表示するメソッド
    static void PrintArray(int[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            Console.Write($"{data[i]} ");
        }
        Console.WriteLine();
    }
}
C#

コードのポイント解説

  • 外側のループ
    • 配列全体を何回もなめるためのループです。
    • 1回のループで「一番大きい値」が右端に押し出されていくイメージです。
  • 内側のループ
    • 隣り合う 2 つの要素 data[j]data[j + 1] を比較します。
    • 昇順では「左が右より大きいなら交換」します。
  • 交換(swap)
    • 一時変数 temp を使って、2つの値を入れ替えます。
    • 交換は並び替えの基本操作なので、しっかりイメージしておくと後で役立ちます。

降順並び替え(大きい順)

昇順との違いは「比較条件」だけ

降順(大きい順)に並び替えたい場合、 バブルソートのロジック自体は同じで、比較条件だけを逆にします

昇順では:

  • if (data[j] > data[j + 1])

降順では:

  • if (data[j] < data[j + 1])

といった具合です。

降順バブルソートのコード例

using System;

class Program
{
    static void Main(string[] args)
    {
        int[] numbers = { 30, 10, 50, 20, 40 };

        Console.WriteLine("=== 並び替え前 ===");
        PrintArray(numbers);

        // 降順に並び替えます(バブルソート)
        BubbleSortDescending(numbers);

        Console.WriteLine("\n=== 降順並び替え後 ===");
        PrintArray(numbers);

        Console.ReadLine();
    }

    // 降順バブルソート
    static void BubbleSortDescending(int[] data)
    {
        int n = data.Length;

        for (int i = 0; i < n - 1; i++)
        {
            for (int j = 0; j < n - 1 - i; j++)
            {
                // 降順では「左が右より小さいなら交換」
                if (data[j] < data[j + 1])
                {
                    int temp = data[j];
                    data[j] = data[j + 1];
                    data[j + 1] = temp;
                }
            }
        }
    }

    static void PrintArray(int[] data)
    {
        for (int i = 0; i < data.Length; i++)
        {
            Console.Write($"{data[i]} ");
        }
        Console.WriteLine();
    }
}
C#

コードのポイント解説

  • 昇順と降順の違いは、> < の向きだけです。
  • 並び替えのロジックを理解するうえで、 「比較条件を変えるだけで昇順・降順を切り替えられる」ことを体験しておくと、 後で LINQ の OrderBy / OrderByDescending を学ぶときに理解しやすくなります。

並び替えの考え方をさらに深掘りする

なぜ自分でソートを書く練習をするのか

実務では、ほとんどの場合 Array.Sort や LINQ の OrderBy を使います。 それでも、Day 28 の段階であえて自分でループを書いて並び替えを体験する理由は、

  • 「比較」と「交換」という基本操作を体で覚えるため
  • 配列のインデックスを意識しながらロジックを組み立てる練習になるため
  • 後半で LINQ を使うときに、「中で何が起きているか」をイメージできるようにするため

です。

並び替えの汎用テンプレート

昇順・降順のバブルソートを、 少し汎用的な形でテンプレートとしてまとめておきます。

// 昇順ソート(int 配列)
static void SortAscending(int[] data)
{
    int n = data.Length;

    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (data[j] > data[j + 1])
            {
                int temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
            }
        }
    }
}

// 降順ソート(int 配列)
static void SortDescending(int[] data)
{
    int n = data.Length;

    for (int i = 0; i < n - 1; i++)
    {
        for (int j = 0; j < n - 1 - i; j++)
        {
            if (data[j] < data[j + 1])
            {
                int temp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = temp;
            }
        }
    }
}
C#

このテンプレートを使って、

  • テストの点数を昇順・降順に並び替える
  • 売上データを並び替えて「ランキング」を作る

といった練習をしてみると、並び替えの感覚がぐっと身近になります。

Day 28 のまとめ

Day 28 では、

  • 並び替えの基本的な考え方(比較と交換)
  • 昇順(小さい順)
  • 降順(大きい順)
  • バブルソートを使ったループによる並び替え

を通して、「自分の手で配列の順番をコントロールする」感覚を学びました。

この段階で大事なのは、

「配列のインデックスを意識しながら、比較して、必要なら交換する」

という流れを自然に書けるようになることです。

後半で LINQ の OrderBy / OrderByDescending を学ぶとき、 今日の内容が「中身のイメージ」として必ず役に立ちます。

ぜひ、

  • 自分で配列を作って、昇順・降順のソートを何度も書いてみる
  • 文字列の配列(名前リストなど)を、アルファベット順に並び替える練習をしてみる
  • 並び替えた結果を使って「ランキング表示」や「上位3件だけ表示」などを試してみる

といったアレンジを加えながら、 データ並び替えを「ただのテクニック」ではなく、 データを読み解くための一歩として身につけていってください。

タイトルとURLをコピーしました