Computer/알고리즘

ソート(並べ替え)① : 挿入ソート

안녕도라 2025. 5. 13. 11:23

ソートの定義

順序付け可能なデータの列を、昇順または降順に並び替える操作

順序付け(じゅんじょつけ) 순서 붙이기
昇順(しょうじゅん) 오름 차순
降順(こうじゅん)
내림 차순

ソートの事例

  • 得点表を元にしてランキングを作成する
  • データの集まりから、上位k個を取ってくる
  • 貪欲アルゴリズムの前処理

挿入ソートの定義

「未整列な配列」からデータを1つ取り出し、「整列済み配列」の適切な位置に挿入する

  • 手持ちのトランプを並び替える際

挿入ソートのPseudo Code

insertion_sort(A : 配列, n : Aの要素数)
    for i = 1 to n-1
        // A[i] を、整列済みの A[0] ~ A[i-1] の適切な位置に挿入する

        // 実装の都合上、A[i] の値が上書きされてしまうことがあるので、予め A[i] の値をコピーしておく        
        x <- A[i]

        // A[i] の適切な挿入位置を表す変数 j を用意
        j <- i-1

        // A[i] の適切な挿入位置が見つかるまで、A[i] より大きい要素を1つずつ後ろにずらしていく
        while j >= 0 AND A[j] > x
            A[j+1] = A[j]
            j--

        // A[i] を挿入
        A[j+1] <- x

        // A[0] ~ A[i] が整列済みになった


挿入ソートの時間複雑度

O(n^2) 


using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        var arr = Console.ReadLine().Split().Select(int.Parse).ToArray();
        
        for(int i = 1; i < n; i++)
        {
            int x = arr[i];
            int j = i - 1;
            
            // Shift로직!
            while(j >= 0 && arr[j] > x)
            {
                arr[j+1] = arr[j];
                j--;
            }
            
            arr[j+1] = x;
            
            Console.WriteLine(string.Join(" ", arr));
        }
    }
}