C#中級

中級 C#で学ぶアルゴリズム|練習問題編

導入

アルゴリズムはプログラミングにおける基盤であり、特に実務での応用が求められます。C#を用いたアルゴリズムの理解は、効率的なデータ処理やシステムのパフォーマンス向上に直結します。本記事では、特定のシチュエーションに基づいたアルゴリズムの実装を考え、練習問題を通じて実践的なスキルを磨くことを目的とします。

教科書レベルの解説(アルゴリズム)

重要な概念の整理

アルゴリズムは、特定の問題を解決するための手順や方法を指します。特に、実務ではデータの検索や整理、最適化が求められるため、効率的なアルゴリズムの選定が重要です。ここでは、特定のデータ構造に対して適用可能なアルゴリズムの設計思想を考えます。

コード例(C#)


using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List numbers = new List { 3, 5, 1, 4, 2 };
        List sortedNumbers = MergeSort(numbers);
        Console.WriteLine(string.Join(", ", sortedNumbers));
    }

    static List MergeSort(List list)
    {
        if (list.Count <= 1)
            return list;

        int mid = list.Count / 2;
        List left = MergeSort(list.GetRange(0, mid));
        List right = MergeSort(list.GetRange(mid, list.Count - mid));
        return Merge(left, right);
    }

    static List Merge(List left, List right)
    {
        List result = new List();
        int leftIndex = 0, rightIndex = 0;

        while (leftIndex < left.Count && rightIndex < right.Count)
        {
            if (left[leftIndex] <= right[rightIndex])
            {
                result.Add(left[leftIndex]);
                leftIndex++;
            }
            else
            {
                result.Add(right[rightIndex]);
                rightIndex++;
            }
        }

        result.AddRange(left.GetRange(leftIndex, left.Count - leftIndex));
        result.AddRange(right.GetRange(rightIndex, right.Count - rightIndex));
        return result;
    }
}

コードの行ごとの解説

  1. 最初に必要な名前空間をインポートします。
  2. メインメソッドでソート対象のリストを作成します。
  3. MergeSortメソッドを呼び出し、リストをソートします。
  4. リストが1つ以下の要素の場合、そのまま返します。
  5. リストを半分に分け、それぞれを再帰的にソートします。
  6. Mergeメソッドを使用して、2つのソート済みリストをマージします。
  7. マージ処理では、2つのリストの最小要素を比較し、結果リストに追加します。
  8. 残りの要素を結果リストに追加します。

練習問題編

以下の練習問題に取り組んでみてください。解答と解説も併せて記載しています。

  1. 問題1: 与えられた整数リストの中から、最大値を見つけるアルゴリズムを実装してください。

    模範解答:

    
    static int FindMax(List list)
    {
        int max = list[0];
        foreach (int num in list)
        {
            if (num > max)
                max = num;
        }
        return max;
    }
    
  2. 問題2: リスト内の重複を削除するメソッドを実装してください。

    模範解答:

    
    static List RemoveDuplicates(List list)
    {
        HashSet seen = new HashSet();
        List result = new List();
        foreach (int num in list)
        {
            if (seen.Add(num))
                result.Add(num);
        }
        return result;
    }
    
  3. 問題3: 与えられたリストを逆順にするアルゴリズムを実装してください。

    模範解答:

    
    static List ReverseList(List list)
    {
        List reversed = new List(list);
        reversed.Reverse();
        return reversed;
    }
    

まとめ

  • アルゴリズムは実務でのデータ処理において重要な役割を果たします。
  • 具体的なシチュエーションに基づいたアルゴリズムを理解することで、実践的なスキルが向上します。
  • 練習問題を通じて、アルゴリズムの実装力をさらに高めていきましょう。