실전 프로그래밍에서는 정렬 알고리즘이 대게 라이브러리나 API를 통해서 미리 주어저 있기 때문에 직접 작성하는 경우는 드물다. 하지만 정렬 알고리즘의 속에는 프로그래밍에서 마주치는 알고리즘 문제의 '피와 살'이 모두 녹아 있다. 알고리즘을 집대성한 "The Art Of Computer Programming"의 저자 도널드 카누스 교수는 정렬 알고리즘에 대해서 30여년 전에 다음과 같이 말했다.
~cpp "정렬은 전통적으로 비즈니스 데이터 처리의 과정에서 사용되어 왔지만 모든 프로그래머들이 다양한 상황에서 사용하기 위해서 반드시 기억해야 하는 기초적 도구이다."
정렬 알고리즘 중에서 가장 널리 알려져 있는 것 중 하나가 '퀵정렬(Quick Sort)'이다. 퀵정렬은 현재 옥스퍼드 대학의 명예교수인 토니호어가 60년대에 발명한 알고리즘으로 '재귀'를 이용한 매우 간단하고 아름다운 정렬기법이다.
~cpp
QuickSort(list)
{
if(length(list)<2){
return list
}
X = PickPivot(list)
list1 = {y in list where y < x}
list2 = {x}
list3 = {y in list where y > x}
QuickSort(list1)
QuickSort(list2)
QuickSort(list3)
return Concatenate(list1, list2, list3)
}
1.리스트에서 x를
잘 고른다.
2.x보다 작은 값들은 왼쪽 리스트, 큰 값들은 오른쪽 리스트에 속한다.
3.왼쪽 리스트에 대해서 (재귀적으로) 퀵정렬을 수행한다.
4.오른쪽 리스트에 대해서 (재귀적으로) 퀵정렬을 수행한다.
5.정렬이 끝난 왼쪽 리스트, x, 오른쪽 리스트를 모두 하나로 이어 붙인다.
주의: x를 잘 골라야한다. x가 리스트의 최대 또는 최소값이면 최악의 경우(Worst Case)이다. x를 고르는 방법에 따라서 알고리즘의 성능이 조금씩 달라지기 때문에 퀵정렬 알고리즘에는 여러가지 변형이 존재한다.
모든 알고리즘은 저마다 최적의 조건과 최악의 조건이 다르기 때문에 환경의 변황에 따라서 알고리즘의 수행방식이 조금씩 달라지는 변형된 모습을 가지고 있다.
'밀리세컨드(1/1000초)'를 다투는 정렬 알고리즘에서 간단한 명령어를 하나 더 더하거나 논리의 흐름을 조절하는 방식을 약간 바꾸는 행위만으로도 전체적으로 성능에 영향을 미칠 수 있다.
알고리즘을 공부할 때는 무슨 알고리즘이 이렇고 저렇고 하며 암기를 할 것이 아니라, 각 알고리즘이 구현하고 있는 핵심 방법론을 이해하는 것이 중요한다.