알고리즘 & 자료구조/알고리즘

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

인디아나쥰이 2021. 3. 4. 11:28

예를 들어

*1 10 5 8 7 6 4 3 2 9 *

라는 숫자들을 오름차순으로 정렬하려고 한다고 가정해보자

 

 

사람이라면 직관적으로 보고 작은 수 를 찾아 순서대로 정렬하겠지만,

컴퓨터는 배열을 하나하나 읽기전 까지는 어떤 값이 들어있는지 알지 못한다.

따라서 정렬을 위해서는 알고리즘이 필요하다.

 

 

그 중에서도 선택정렬은 모든 배열을 탐색 후, 가장 작은 수를 앞으로 보내는 방식으로 동작한다.


ex)

arr[10]

 

*1 10 5 8 7 6 4 3 2 9 *

 

모든 배열을 탐색 후 , 1이 가장 작은 숫자로 알맞은 위치에 있으므로,

이제는 1을 제외한 10 부터 9까지를 탐색해준다.

 

*1 2 5 8 7 6 4 3 10 9 *

 

나머지 배열중에 가장 작은 수는 2이므로 arr[1] 인덱스의 값으로 넣어주고 원래 2라는 값이 있던

인덱스 arr[8]에는 10을 넣어 자리를 바꿔준다.

이런식으로 오름차순이 완성될때 까지 반복 해주면 된다.


예제와 같은 식으로 반복 한다면

처음 1 부터 10 까지 10 번을 연산

그 다음엔 이미 정렬된 1을 제외한 9번을 연산

정렬된 1과 2 를 제외한 8번......... 반복하다보면

 

더보기

등차수열의 합

n: 항의 갯수

a: 등차 수열의 첫째 항

l : 끝항

 

$$S_{n} = n(a+l) / 2$$

 

등차수열의 합 공식에 따라서 10 * (10 + 1) /2 => 55 가 되고 

수식으로 작성하면 n*(n+1) /2 여서

Big O 표기법으로 시간 복잡도는  O(n^2) 이 된다.

 

이차 함수의 그래프를 생각 해보았을때 

 

x 축을 데이터 y 축을 시간 이라고 한다면 ,

데이터 양이 증가할수록↑ 시간 역시 늘어나기 때문에

데이터 양이 많을땐 효율적인 알고리즘이라고 하기 힘들다.

#include <stdio.h>

int main(void)
{
    int i,j,min,index,temp;
    int arr[10] = {1,10,5,8,7,6,4,3,2,9};
    for(i = 0; i < 10; i++) //비교할 기준 인덱스
    {
        min = 9999;
        for(j = i; j < 10; j++) //나머지 인덱스와 비교 
        {
            if(min > arr[j])
            {
                min = arr[j];
                index = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;

    }

    for(i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

 

 

 

 

728x90
반응형