선택 정렬

2024. 1. 26. 14:29

목표 

가끔 코딩 테스트 문제를 풀다가 정렬에 대한 문제가 나오는데, 
헷갈릴 때가 많다. 항상 헷갈리는 이유중 하나가 왜 선택 정렬이고 왜 삽입 정렬이고 이런 생각을 안해봐서 그렇다.
그래서 이번 기회에 선택 정렬, 버블 정렬 , 삽입 정렬에 대해서 

공부하고 정리해 보려고 한다. 
그 중 선택 정렬에 대해 간단히 정리해 보았다.

 

선택 정렬 

현재 인덱스에 들어갈 값을 선택하는 정렬
즉, 루프를 돌면서 해당 인덱스에 올 데이터를 선택하는 정렬이다.

선택정렬을 사용하여 오름차순으로 정렬 할 때,
첫번째 인덱스에 올 데이터는 어떻게 구해야 할까?

 

크기가 100 개 인 경우, 첫번째 인덱스를 제외한 나머지 숫자들 중 가장 작은 숫자를 구하고 

구한 수 ( 12 ) 와 현재 첫번째 인덱스에 있는 수를 비교하여
작은 값을 넣어 주면 된다.

이런 행동을 마지막 인덱스 까지 반복하면 된다. 
회차가 지날 수록 조회 해야하는 수가 줄어든다.

 시간 복잡도를 계산 해보면 

코드로 구현 해 보자
    public static void main(String[] args) throws IOException {

        BufferedReader br       = new BufferedReader(new InputStreamReader(System.in));
        int arrSize             = Integer.parseInt(br.readLine());
        int[]          arr      = new int[arrSize];


        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        for( int i = 0; i < arrSize; i++)
        { arr[i] = Integer.parseInt(st.nextToken()); }

        for(int i = 0 ; i<arrSize-1; i++)
        {
            int minIdx = i;
            for(int j = i+1; j<arrSize; j++)
            {
                if(arr[j] < arr[minIdx] ) minIdx = j;
            }

            int temp = arr[i];
            arr[i] = arr[minIdx];
            arr[minIdx] = temp;
        }


        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
입력 값 

10
112 212 32 5 1 543 6 75 23 13

 

출력 값 

1 5 6 13 23 32 75 112 212 543

 

후기 

어쩌다가 한번씩 풀어보는 정렬 문제여서 그렇게 깊게 찾아보지도 않았다.
해당 인덱스에 오는 값들을 선택하는 것을 굳이 강조하여 머리에 욱여 넣었지만 
덕분에 기억에 오래 남을 것 같다.