21강 선택 정렬

정렬이란

  • 데이터를 특정한 기준에 따라 순서대로 나열하는 것
  • 일반적으로 문제 상황에 따라서 적절한 정렬 알고리즘이 공식처럼 사용됨


선택 정렬이란


처리되지 않은 데이터 중에서 가장 작은 데이터를 선택해 맨 앞에 있는 데이터와 바꾸는 것을 반복한다.

동작 원리

✅마지막 9는 범위에 한 개밖에 없으므로 처리하지 않아도 된다.

참고 : 선택 정렬 구현을 위해 이중 반복문 사용

  • 반복 시 마다 탐색 범위가 줄어든다.
  • 가장 작은 원소를 찾기위해 매번 탐색 범위 만큼 데이터를 하나씩 확인하는 선형탐색(왼쪽부터 오른쪽으로 차례대로 탐색) 수행

예제

public class Main {

    public static void main(String[] args) {

        int n = 10;
        int[] arr = {7, 5, 9, 0, 3, 1, 6, 2, 4, 8};

        // arr[i] : 가장 작은 원소와 위치가 바뀔 인덱스 (탐색 범위 내 가장 앞쪽 인덱스)
        for (int i = 0; i < n; i++) {
        	// 가장 작은 원소의 인덱스 (일단 탐색 범위 내 가장 앞쪽 인덱스로 초기화)
        	int min_index = i; 
        	// 선형 탐색(순차 탐색)으로 i~n까지 중 가장 작은 원소의 인덱스를 찾아 저장한다.
        	// 외부 for문의 마지막 회차(i가 9)에는 내부 for문이 j < n 에 벗어나므로 내부 for문 작동 X
            for (int j = i + 1; j < n; j++) {
                if (arr[min_index] > arr[j]) {
                    min_index = j;
                }
            }
            // 스와프
            int temp = arr[i];
            arr[i] = arr[min_index];
            arr[min_index] = temp;
        }

        for(int i = 0; i < n; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

시간 복잡도

  • 선택정렬은 N번 만큼(= 외부for문) 가장 작은 수를 찾아서 맨 앞으로 보내야함
  • 구현 방식에 따라서 사소한 오차는 있을 수 있으나 전체 연산 횟수는
    n(n+1)/2 => (n^2+n)/2 => O(N^2)

[앞선 예제의 시간 복잡도]
O(N) + O(N^2) => O(N^2)
-외부for문 : 0 1 2 3 4 5 6 7 8 9 (번 째) : O(N)
-내부for문 : 9 8 7 6 5 4 3 2 1 0 (반복 횟수) : O(N^2)

문제에서 주어진 배열의 길이 N10일 때 
내부for문의 총 반복 횟수(9+8+7+...+2+1)를 구하려면
(n-1)((n-1)+1)/2 => n(n-1)/2 => O(N^2)

참고 : 등차수열 공식
n + (n-1) + (n-2) + ... + 2 + 1 => n(n+1)/2

참고 : 다른 예제
min_index 변수에 i가 아니라 최대값 상수(ex.9999)를 넣으면
10+9+8+7...+2+1만큼 반복하므로 등차수열 공식(n(n+1)/2) 그대로 적용 가능

좋은 웹페이지 즐겨찾기