본문 바로가기
공부/알고리즘

선택정렬 복습

by 맑은청이 2020. 5. 26.
728x90
반응형

복습이라고 적은 이유는 이 노트가 컴공들의 선생님 같은 존재인 '나동빈' 선생님의 알고리즘 기초 강의를 보고 작성하는 거기 때문입니다. 

 

 

선택정렬을 정렬 중에서 가장 기본이고 가장 비효율적인 정렬이라고 할 수 있습니다. 

말로 풀어보자면 '가장 작은 수를 선택해서 앞에 수와 바꾼다' 인데요. 일단 가장 작은 수를 선택하기 위해서 배열을 다 돌아야하기 때문에 말로만 들어도 좀 비효율적인 느낌입니다. 그럼 예시를 들어보겠습니다. 

 

다음과 같이 정렬되지 않은 배열이 있습니다. 

 

 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를 씁니다.)

 

 

선택정렬 코드 구현

C
C++

 

Python

 

선택정렬의 시간복잡도

5개의 배열을 구하는건 다음과 같습니다.

 

5 (처음으로 가장 작은 수를 구하는데 드는 연산 수)

4 (첫번째 수를 제외한 나머지 배열에서 가장 작은 수를 구하는데 연산 수)

3

2

1

 

n이 하나씩 줄어드는 모습인데 이를 다 더했을 때 는 n(n+1)/2 로 계산이 가능합니다. 

시간복잡도에선 상수 값이 중요치 않기 때문에 선택정렬의 시간복잡도가 다음과 같음을 쉽게 알 수 있습니다.

 

O(n^2)

 

오늘은 선택정렬을 공부하고 다양한 언어로 구현해봤습니다. 수고하셨습니다. 

728x90
반응형

'공부 > 알고리즘' 카테고리의 다른 글

퀵정렬 복습  (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