복습이라고 적은 이유는 이 노트가 컴공들의 선생님 같은 존재인 '나동빈' 선생님의 알고리즘 기초 강의를 보고 작성하는 거기 때문입니다.
선택정렬을 정렬 중에서 가장 기본이고 가장 비효율적인 정렬이라고 할 수 있습니다.
말로 풀어보자면 '가장 작은 수를 선택해서 앞에 수와 바꾼다' 인데요. 일단 가장 작은 수를 선택하기 위해서 배열을 다 돌아야하기 때문에 말로만 들어도 좀 비효율적인 느낌입니다. 그럼 예시를 들어보겠습니다.
다음과 같이 정렬되지 않은 배열이 있습니다.
3 4 1 5 2
배열을 쓱 보고 가장 작은 수를 선택합니다. 1입니다. 그럼 첫번째 수인 3과 교환해줍니다.
1 4 3 5 2
이제 1은 신경쓰지 않아도 됩니다. 2번째 수인 4부터 시작해서 가장 작은 수를 찾아봅니다. 처음부터 봐도 끝까지 다 봐야 가장 작은 수가 무엇일지 판단할 수 있습니다. 첫번째 수를 제외한 나머지 배열에서 가장 작은 수는 2입니다. 이걸 두번째 수인 '4'와 바꿔줍니다.
이걸 끝까지 반복해주면 됩니다!
1 2 3 5 4
작은 숫자는 3
1 2 3 5 4
작은 숫자는 4
1 2 3 4 5
작은 숫자는 5 (이 부분은 생략이 가능합니다.)
1 2 3 4 5
이게 선택 정렬입니다. 그럼 코드로 구현해볼까요? 저는 요새 공부하고 있는 파이썬, C,C++로 구현을 해봤습니다. (주로 C를 씁니다.)
선택정렬 코드 구현
선택정렬의 시간복잡도
5개의 배열을 구하는건 다음과 같습니다.
5 (처음으로 가장 작은 수를 구하는데 드는 연산 수)
4 (첫번째 수를 제외한 나머지 배열에서 가장 작은 수를 구하는데 연산 수)
3
2
1
n이 하나씩 줄어드는 모습인데 이를 다 더했을 때 는 n(n+1)/2 로 계산이 가능합니다.
시간복잡도에선 상수 값이 중요치 않기 때문에 선택정렬의 시간복잡도가 다음과 같음을 쉽게 알 수 있습니다.
O(n^2)
오늘은 선택정렬을 공부하고 다양한 언어로 구현해봤습니다. 수고하셨습니다.
'공부 > 알고리즘' 카테고리의 다른 글
퀵정렬 복습 (0) | 2020.05.28 |
---|---|
삽입정렬 복습(Insertion Sort) (0) | 2020.05.27 |
버블 정렬 복습(Bubble Sort) (0) | 2020.05.27 |
탐욕 알고리즘(Greedy Algorithm) (0) | 2020.05.21 |
서로소 집합 데이터 구조_Abstract Data Type (0) | 2020.05.20 |