-
[알고리즘] 선택 정렬 (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반응형'알고리즘 & 자료구조 > 알고리즘' 카테고리의 다른 글
[Algorithm] 완전탐색 (Brute-Force Search ) 알고리즘 (0) 2021.06.20 알고리즘 시각화 해서 볼 수 있는 사이트 (0) 2021.03.22 [알고리즘] 삽입 정렬(Insertion Sort) (0) 2021.03.06 [알고리즘] 버블 정렬 (0) 2021.01.19