말로만하는 - 정렬 알고리즘(for 기술면접)

정렬 역시 프로그래밍 기술면접 단골질문이다. 정렬은 기술면접을 떠나서 자료구조/알고리즘 과목에서도 기초로 배운다. 다양한 방법으로 구현할 수 있고, 구현방법에 따라서 시간복잡도 역시 천차만별이기 때문에 학습용으로 제격이 아닐까. 이번 글에서는 6가지 대표적인 정렬 알고리즘에 대해서 정리해보았다. 기술면접을 대비한 정리로 ‘말/글’로 표현하는 데에 집중되어 있으며, 파이썬 코드를 첨부하였다. (참고로 이 글에 구현된 quick sort 코드의 경우 구현의 편의 상 새로운 리스트를 만드는 과정으로 인해 runtime이 매우 길어 개선이 필요하다.)

정렬 알고리즘의 분류

정렬 알고리즘에는 대표적으로 selection sort, insertion sort, bubble sort, quick sort, merge sort등이 있다. 정렬알고리즘은 실행방법에 따라서 또는 정렬 장소에 따라서 분류할 수 있다.

실행방법

실행 방법에 따라서 비교식 정렬(comparative sort)분산식 정렬(distribute sort)로 분류할 수 있다. 비교식 정렬은 두 값을 비교하여 교환하며 정렬해나가는 방법이고, 분산식 정렬은 키값을 기준으로 부분집합을 만든 뒤 각 부분집합을 정렬해나가는 방법이다.

정렬 장소

정렬 장소에 따라서 내부 정렬(internal sort)외부 정렬(external sort)로 분류할 수 있다. 내부 정렬은 정렬할 데이터를 메모리에 모두 올려서 정렬하는 방식이다. 반면, 외부 정렬은 주기억장치에 정렬할 데이터를 모두 올리기 어려운 경우에 보조기억장치를 활용하는 방법이다. 주기억장치에 올릴 수 있을 만큼의 데이터만 올린 뒤 내부정렬 방법을 사용하여 정렬하고 정렬된 데이터를 보조기억장치에 쓴다. 정렬된 데이터가 N개 있으면, 차례로 일부분씩 불러와 merge sort와 같은 방법으로 정렬하여 보조기억장치에 쓴다.
이제 각 정렬방식을 비교해보자.

선택정렬(selection sort)

가장 작은 것을 선택해서 앞으로 보내는 정렬기법.

버블정렬(bubble sort)

연속적인 두 원소끼리 비교해서 큰 값을 뒤로 보내나가는 정렬 기법이다.

삽입정렬(insertion sort)

각 숫자를 적절한 위치에 삽입하는 정렬 기법.

퀵정렬(quick sort)

리스트 내 임의의 값을 기준으로 작은 값들/큰 값들 두 부분으로 나눈 뒤 재귀적으로 소팅하는 방법이다.

합병정렬(merge sort)

정렬할 배열을 반으로 나누어 각각 재귀적으로 정렬한 뒤 병합하는 방법이다.