ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [알고리즘] 선택 정렬 (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
    반응형

    댓글

Designed by Tistory.