[정렬 알고리즘, C#] 선택 정렬(Selection Sort)

2025. 6. 17. 17:57·Unity,C#/알고리즘
728x90

■ 선택 정렬(Selection Sort)

선택 정렬은 배열에서 값을 하나 선택한 뒤, 뒤쪽 값들과 비교해 최솟값(오름차순 기준)을 찾아 교환하는 방식으로 앞쪽부터 순차적으로 정렬해 나가는 알고리즘이다.

[선택 정렬 예시]

선택 정렬의 동작 방식은 아래와 같다.

  1. 배열의 첫 번째 값을 선택한다.
  2. 나머지 값들과 비교하면서 가장 작은 값을 찾는다.
  3. 찾은 최소값을 현재 위치와 교환한다.
  4. 다음 위치로 이동해 배열의 끝까지 이를 반복하며 정렬한다.

즉, 버블 정렬(Bubble Sort)과 달리, 선택 정렬은 각 사이클마다 배열의 길이에 비례한 비교 연산을 수행하지만, 실제로 값의 교환은 한 번만 발생한다.

  • 버블 정렬은 인접한 두 값을 비교하며 여러 변 교환을 수행하지만, 선택 정렬은 가장 작은 값을 찾고 한 번만 교환하기 때문.

 

■ 선택 정렬 구현(C#)

public static class SortArray<T> where T : IComparable<T>
{
    // 선택 정렬
    public static void SelectionSort(T[] arr)
    {
        for(var i = 0; i < arr.Length; ++i)
        {
            var minIndex = i;

            for(int j = i + 1; j < arr.Length; ++j)
            {
                if (arr[j].CompareTo(arr[minIndex]) < 0)
                {
                    minIndex = j;
                }
            }

            if(minIndex != i)
            {
                (arr[i], arr[minIndex]) = (arr[minIndex], arr[i]);
            }
        }
    }
}

선택 정렬의 구현은 매우 간단하다.

현재 위치 값을 기준으로, 그 뒤의 모든 값들과 비교하여 최솟값의 위치를 찾은 뒤, 반복이 끝난 시점에 해당 위치의 값과 교환한다.

  • 이때, C#의 튜플 스왑 문법을 활용하면 별도의 임시 변수를 만들지 않고도 간결하게 값을 교환할 수 있다.

 

선택 정렬이 유리한 경우

선택 정렬은 비교 연산은 많이 수행하지만, 교환 횟수는 한 사이클당 최대 1회로 제한되기 때문에 데이터 이동 비용이 중요한 경우에 상대적으로 유리한 정렬 방식이다.

 

▶ 선택 정렬의 시간복잡도

선택 정렬은 이중 반복문을 사용하여 모든 원소를 비교하면서 정렬을 수행하기 때문에, $O(n^2)$의 시간복잡도를 가진다.

  • 각 반복 회차마자 최솟값을 찾기 위해 남은 원소들과 비교.
  • $\frac{n(n-1)}{2}$번의 비교 연산이 이루어진다.

따라서 입력 데이터의 정렬 상태와 관계없이 항상 일정한 연산량이 발생한다는 특징을 갖는다.

728x90

'Unity,C# > 알고리즘' 카테고리의 다른 글

[정렬 알고리즘, C#] 퀵 정렬(Quick Sort) - Hoare, Lomuto 분할 방식  (1) 2025.06.18
[정렬 알고리즘, C#] 삽입 정렬(Insertion Sort)  (0) 2025.06.17
[정렬 알고리즘, C#] 버블 정렬(Bubble Sort)  (1) 2025.06.17
[C#, Unity, 최단경로(PathFinding)] TileMap A* 알고리즘  (0) 2025.04.10
[C#, Unity, 최단경로(PathFinding)] TileMap 다익스트라(Dijkstra) 알고리즘  (0) 2025.04.10
'Unity,C#/알고리즘' 카테고리의 다른 글
  • [정렬 알고리즘, C#] 퀵 정렬(Quick Sort) - Hoare, Lomuto 분할 방식
  • [정렬 알고리즘, C#] 삽입 정렬(Insertion Sort)
  • [정렬 알고리즘, C#] 버블 정렬(Bubble Sort)
  • [C#, Unity, 최단경로(PathFinding)] TileMap A* 알고리즘
브라더스톤
브라더스톤
유티니, C#과 관련한 여러 정보를 끄적여둔 블로그입니다. Email : dkavmdk98@gmail.com
  • 브라더스톤
    젊은 프로그래머의 슬픔
    브라더스톤
  • 전체
    오늘
    어제
    • 개발 노트 (26)
      • Unity,C# (26)
        • Unity 정보 (5)
        • 알고리즘 (10)
        • 자료구조 (2)
        • 절차적생성(PCG) (9)
      • C++ (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    이진공간분할
    최단경로찾기
    C#
    pcg
    커스텀 인스펙터
    커스텀 윈도우
    unity
    CustomEditorWindow
    정렬알고리즘
    BSP
    절차적지형생성
    CustomWindow
    PerlinNoise
    Custom Inspector
    자료구조
    절차적 던전 생성
    binary space partitioning
    이진공간분할법
    절차적던전생성
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
브라더스톤
[정렬 알고리즘, C#] 선택 정렬(Selection Sort)
상단으로

티스토리툴바